首页 > 图片资讯

天天快资讯丨C++面试八股文:std::vector了解吗?

来源:博客园 时间:2023-06-24 07:11:58

某日二师兄参加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 #include int main(int argc, char const *argv[]){    std::vector 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 #include int main(int argc, char const *argv[]){    std::vector 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().swap(vi); //使用临时量(size =0, capacity=0)和vi交换,临时量会立即析构    std::cout << vi.size() << " " << vi.capacity() << std::endl;    //0 0}

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

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

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

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

关注我,带你21天“精通”C++!(狗头)

相关稿件

天天快资讯丨C++面试八股文:std::vector了解吗?

下月初,快乐一半,悲伤一半,3星座相爱却停不下来,无法自拔-环球观焦点

犬科动物和猫科动物哪个厉害 犬科动物

即时:血压压差大是什么原因,如何治疗 血压压差大是什么原因

日本奄美大岛连降大雨 300余名居民被困

内江城区夜空首次无人机组团特技表演尽显艺术与科技的魅力 资讯

全球视讯!【端午近郊游】喜欢蜂糖李的友友千万别错过这个地方!

派对必备!超可爱的儿童万圣节工艺品送给女性好友,更是生日礼物的首选! 前沿资讯

合成燃料脱碳,代价有多大? 即时看

意甲:米兰不看好门将永达尔的未来,决定让其免费加盟赫塔菲-重点聚焦

当前速递!国内唯一没有规划高铁的省会:不仅成本高难度更大,风景倒是绝美

土乌防长通电话 讨论黑海港口农产品外运协议问题-环球动态

俄罗斯称美国正扩充驻叙利亚兵力

世界热消息:黄楚标_关于黄楚标的介绍

梁宝华_关于梁宝华的介绍

驾驶证换证要居住证吗(驾驶证换证要居住证吗?)

为什么叫小罗伯特唐尼 罗伯特唐尼

6月21日基金净值:兴业收益增强债券A最新净值1.394,跌0.29%

6月21日基金净值:嘉实稳惠6个月持有期混合A最新净值1.0378,跌0.21%_焦点热讯

女生项链品牌排行榜平价_比较平价的项链品牌谁能推荐几款女士项链品牌有哪些产品_前沿资讯

全球关注:塞尔达传说荒野之息古代武器怎么刷(塞尔达古代武器哪里刷)

空调变频和定频有什么区别(立式空调变频和定频有什么区别)_头条

舞阳县交通事故认尸启事|当前消息

北京22.4万考生6月24日起参加初中学业水平考试 世界快看点

【世界独家】新华全媒+丨绿色赋能 “风”“光”迤逦——江苏盐城新能源产业发展一线见闻

安徽安庆迎江区华中路第三小学:巧手做香囊 非遗润童心-环球实时

当前速讯:iOS17果粉真的满意吗?安卓系统更有反超之势

当前速读:寓教于乐,赋能"双减"————安阳市三官庙小学低年级期末综合素质测评活动

古典吉他十大品牌有哪些 古典吉他十大品牌

除朱婷李盈莹,中国无出色主攻?因蔡斌死抱王云蕗,不肯培养新人