C++面试八股文:std::vector了解吗?
2023/6/24 1:22:32
本文主要是介绍C++面试八股文:std::vector了解吗?,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
某日二师兄参加XXX科技公司的C++工程师开发岗位第23面:
面试官:
vector
了解吗?二师兄:嗯,用过。
面试官:那你知道
vector
底层是如何实现的吗?二师兄:
vector
底层使用动态数组来存储元素对象,同时使用size
和capacity
记录当前元素的数量和当前动态数组的容量。如果持续的push_back(emplace_back)
元素,当size
大于capacity
时,需要开辟一块更大的动态数组,并把旧动态数组上的元素搬移到当前动态数组,然后销毁旧的动态数组。面试官:你知道新开辟的动态数组的容量是就数组的多少倍比较合适?
二师兄:这个值在不同的编译器上不是固定的。MSVC 是1.5,而GCC是2。
面试官:有没有什么好的办法提升vector连续插入效率?
二师兄:有的,如果知道数据的大概量,我们可以使用
reserve
方法直接为vector
扩容这个量级。这样在后续的数据插入时就不会因为频繁的capacity
被用尽而导致的多次的数据搬移,从而提升vector
插入效率。面试官:
push_back
和emplace_back
有什么区别?二师兄:两者都可以在容器尾部插入元素。在GCC中,如果插入的元素是右值,两者都会
move
元素到容器。如果是左值,两者都会copy
元素到容器。唯一不同的一点是,当C++版本高于C++17时,emplace_back
返回当前插入的值的引用,而push_back
返回void
。面试官:
erase
和remove
有什么区别?二师兄:
erase
属于成员函数,erase
删除了元素,remove
属于算法库函数,而remove
只会把元素移动到尾部。面试官:哪些情况下迭代器会失效?
二师兄:迭代器失效主要有两种情况引起:1.插入数据。由于插入数据可能导致数据搬移(
size > capacity
),所以迭代器失效。2.删除数据。当使用erase
删除数据时,被删除数据后面的数据依次向前移一位。这会导致被删除数据之后的迭代器失效。面试官:如何快速的清空
vector
容器并释放vector
容器所占用的内存?二师兄:有两种方法:第一种,使用
clear
方法清空所有元素。然后使用shrink_to_fit
方法把capacity
和size(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++!(狗头)
这篇关于C++面试八股文:std::vector了解吗?的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-15在使用平台私钥进行解密时提示 "私钥解密失败" 错误信息是什么原因?-icode9专业技术文章分享
- 2024-11-15Layui框架有哪些方式引入?-icode9专业技术文章分享
- 2024-11-15Layui框架中有哪些减少对全局环境的污染方法?-icode9专业技术文章分享
- 2024-11-15laydate怎么关闭自动的日期格式校验功能?-icode9专业技术文章分享
- 2024-11-15laydate怎么取消初始日期校验?-icode9专业技术文章分享
- 2024-11-15SendGrid 的邮件发送时,怎么设置回复邮箱?-icode9专业技术文章分享
- 2024-11-15使用 SendGrid API 发送邮件后获取到唯一的请求 ID?-icode9专业技术文章分享
- 2024-11-15mailgun 发送邮件 tags标签最多有多少个?-icode9专业技术文章分享
- 2024-11-15mailgun 发送邮件 怎么批量发送给多个人?-icode9专业技术文章分享
- 2024-11-15如何搭建web开发环境并实现 web项目在浏览器中访问?-icode9专业技术文章分享