C++面试八股文:std::vector了解吗?

这篇具有很好参考价值的文章主要介绍了C++面试八股文:std::vector了解吗?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

某日二师兄参加XXX科技公司的C++工程师开发岗位第23面:

面试官:vector了解吗?

二师兄:嗯,用过。

面试官:那你知道vector底层是如何实现的吗?

二师兄:vector底层使用动态数组来存储元素对象,同时使用sizecapacity记录当前元素的数量和当前动态数组的容量。如果持续的push_back(emplace_back)元素,当size大于capacity时,需要开辟一块更大的动态数组,并把旧动态数组上的元素搬移到当前动态数组,然后销毁旧的动态数组。

面试官:你知道新开辟的动态数组的容量是就数组的多少倍比较合适?

二师兄:这个值在不同的编译器上不是固定的。MSVC 是1.5,而GCC是2。

面试官:有没有什么好的办法提升vector连续插入效率?

二师兄:有的,如果知道数据的大概量,我们可以使用reserve方法直接为vector扩容这个量级。这样在后续的数据插入时就不会因为频繁的capacity被用尽而导致的多次的数据搬移,从而提升vector插入效率。

面试官:push_backemplace_back有什么区别?

二师兄:两者都可以在容器尾部插入元素。在GCC中,如果插入的元素是右值,两者都会move元素到容器。如果是左值,两者都会copy元素到容器。唯一不同的一点是,当C++版本高于C++17时,emplace_back返回当前插入的值的引用,而push_back返回void

面试官:eraseremove有什么区别?

二师兄:erase属于成员函数,erase删除了元素,remove属于算法库函数,而remove只会把元素移动到尾部。

面试官:哪些情况下迭代器会失效?

二师兄:迭代器失效主要有两种情况引起:1.插入数据。由于插入数据可能导致数据搬移(size > capacity),所以迭代器失效。2.删除数据。当使用erase删除数据时,被删除数据后面的数据依次向前移一位。这会导致被删除数据之后的迭代器失效。

面试官:如何快速的清空vector容器并释放vector容器所占用的内存?

二师兄:有两种方法:第一种,使用clear方法清空所有元素。然后使用shrink_to_fit方法把capacitysize(0)对齐,达到释放内存的作用:

#include <iostream>
#include <vector>
int main(int argc, char const *argv[])
{
    std::vector<int> vi;
    vi.reserve(1024);
    for (int i = 0; i < 1024; i++) vi.push_back(i);
    std::cout << vi.size() << " " << vi.capacity() << std::endl;    //1024 1024
    vi.clear(); 
    std::cout << vi.size() << " " << vi.capacity() << std::endl;    //0 1024
    vi.shrink_to_fit(); 
    std::cout << vi.size() << " " << vi.capacity() << std::endl;    //0 0
}

二师兄:第二种,使用swap方法;

#include <iostream>
#include <vector>
int main(int argc, char const *argv[])
{
    std::vector<int> vi;
    vi.reserve(1024);
    for (int i = 0; i < 1024; i++) vi.push_back(i);
    std::cout << vi.size() << " " << vi.capacity() << std::endl;    //1024 1024
    std::vector<int>().swap(vi); //使用临时量(size =0, capacity=0)和vi交换,临时量会立即析构
    std::cout << vi.size() << " " << vi.capacity() << std::endl;    //0 0
}

面试官:你知道vector<bool>是如何实现的吗?

二师兄:vector<bool>的实现和其他实现容器的实现不一致。每个元素被当作一个位而不是一个字节存储。这导致我们不能直接访问该元素,也无法对每个元素取地址(8个元素可能在同一个字节中存储)。所以不建议使用vector<bool>,必要时可以使用std::bitset替代。

面试官:好的,回去等通知吧。

今天二师兄表现不错,同时要感谢小伙伴的耐心阅读。让我们一起期待明天二师兄的面试之旅吧。

关注我,带你21天“精通”C++!(狗头)文章来源地址https://www.toymoban.com/news/detail-497242.html

到了这里,关于C++面试八股文:std::vector了解吗?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++面试八股文:std::array如何实现编译器排序?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第25面: 面试官: array 熟悉吗? 二师兄:你说的是原生数组还是 std::array ? 面试官:你觉得两者有什么区别? 二师兄:区别不是很大,原生数组(非动态数组)和std::array都在栈上开辟空间,初始化的时候需要提供数组长度,且

    2024年02月10日
    浏览(50)
  • C++面试八股文:知道std::unordered_set/std::unordered_map吗?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第27面: 面试官:知道 std::unordered_set/std::unordered_map 吗? 二师兄:知道。两者都是C++11引入的新容器,和 std::set 和 std::map 功能类似, key 唯一, unordered_map 的 value 可变。 二师兄:不同于 set/map , unordered_set/unordered_map 都是无序

    2024年02月11日
    浏览(41)
  • C++面试八股文:了解位运算吗?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第12面: 面试官:了解位运算吗? 二师兄:了解一些。(我很熟悉) 面试官:请列举以下有哪些位运算? 二师兄:按位与( )、按位或( | )、按位异或( ^ ),按位取反( ~ )、左移( )和右移( )。 面试官:好的。那你

    2024年02月08日
    浏览(41)
  • C++面试八股文:了解sizeof操作符吗?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第10面: 面试官:了解 sizeof 操作符吗? 二师兄:略微了解(不就是求大小的嘛。。) 面试官:请讲以下如何使用 sizeof ? 二师兄: sizeof 主要是求变量或者类型的大小。直接使用 sizeof(type) 或 sizeof(var) 即可。 面试官:嗯。 s

    2024年02月08日
    浏览(37)
  • C++面试八股文:了解auto关键字吗?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第15面: 面试官:了解 auto 吗? 二师兄:嗯,了解一些(我很熟悉)。 面试官:说一说 auto 的用法吧? 二师兄: auto 主要是为了编译器进行类型推导。比如: 二师兄:也可以作为函数返回类型的占位符: 二师兄:在C

    2024年02月09日
    浏览(44)
  • C++面试八股文:static_cast了解一下?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第20面: 面试官:C++中支持哪些类型转换? 二师兄:C++支持C风格的类型转换,并在C++11引入新的规范了类型转换。 二师兄:C++11引入四种新的类型转换,分别是 static_cast 、 dynamic_cast 、 const_cast 、和 reinterpret_cast 。 二师

    2024年02月09日
    浏览(34)
  • C++面试八股文:技术勘误

    不知不觉,《C++面试八股文》已经更新30篇了,这是我第一次写技术博客,由于个人能力有限,出现了不少纰漏,在此向各位读者小伙伴们致歉。 为了不误导更多的小伙伴,以后会不定期的出勘误文章,请各位小伙伴留意。 在《C++面试八股文:C++中,设计一个类要注意哪些东

    2024年02月11日
    浏览(50)
  • C++面试八股文:如何避免死锁?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第31面: 面试官:什么是锁?有什么作用? 二师兄:在C++中,锁(Lock)是一种同步工具,用于保护共享资源,防止多个线程同时访问,从而避免数据竞争和不一致。 面试官:有哪些锁? 二师兄:从种类上分,可以分为普通锁、

    2024年02月12日
    浏览(49)
  • C++面试八股文:什么是RAII?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第13面: 面试官:什么是 RAII ? 二师兄: RAII 是 Resource Acquisition Is Initialization 的缩写。翻译成中文是资源获取即初始化。 面试官: RAII 有什么特点和优势? 二师兄:主要的特点是,在对象初始化时获取资源,在对象析构时释放

    2024年02月08日
    浏览(56)
  • C++面试八股文:聊一聊指针?

    某日二师兄参加XXX科技公司的C++工程师开发岗位第17面: 面试官:聊一聊指针? 二师兄:好的。 面试官:你觉得指针本质上是什么? 二师兄:这要从内存地址开始说起了。如果有一块容量是1G的内存,假设它的地址是从 0x00000000 到 0x3fffffff ,每一个字节都对应一个地址。当

    2024年02月09日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包