面试题答案
一键面试vector扩容对性能的具体影响
- 内存重新分配与数据拷贝:当vector容量不足需要扩容时,会重新分配一块更大的内存空间,然后将原内存中的数据逐个拷贝到新内存中。这一过程涉及大量的内存操作,包括内存分配和数据复制,会消耗较多时间。
- 迭代器和指针失效:扩容后内存地址改变,之前获取的迭代器、指针和引用都会失效。如果在代码中没有正确处理,会导致程序出现未定义行为,增加调试成本。
优化措施及适用场景
- 预先分配足够空间
- 措施:使用
reserve
方法预先分配足够的容量,避免在插入元素时频繁扩容。例如:std::vector<int> vec; vec.reserve(1000);
- 适用场景:已知大概需要存储元素数量的场景,如读取固定大小文件的数据到vector中。
- 措施:使用
- 使用
emplace_back
替代push_back
- 措施:
emplace_back
直接在容器尾部构造对象,避免了push_back
可能产生的临时对象拷贝或移动。例如:std::vector<std::string> vec; vec.emplace_back("hello");
- 适用场景:存储自定义类型且构造对象开销较大时,使用
emplace_back
可提升性能。
- 措施:
- 使用
std::vector
的移动语义- 措施:当需要将一个vector的内容转移到另一个vector时,使用移动语义。例如:
std::vector<int> vec1 = {1, 2, 3}; std::vector<int> vec2 = std::move(vec1);
- 适用场景:在函数之间传递vector时,可减少不必要的数据拷贝,提升性能。
- 措施:当需要将一个vector的内容转移到另一个vector时,使用移动语义。例如: