乐趣区

关于c++:C面试八股文stdvector了解吗

某日二师兄加入 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++!(狗头)

退出移动版