面试题答案
一键面试C++中vector常见操作
- 添加元素:
push_back(T value)
:在vector的末尾添加一个元素value
。时间复杂度平均为O(1),因为当vector容量不足时需要重新分配内存,此时时间复杂度为O(n)。insert(iterator position, T value)
:在指定位置position
插入元素value
。时间复杂度为O(n),因为插入位置之后的元素都需要移动。
- 删除元素:
pop_back()
:删除vector末尾的元素。时间复杂度为O(1),因为不需要移动其他元素。erase(iterator position)
:删除指定位置position
的元素。时间复杂度为O(n),因为删除位置之后的元素都需要移动。erase(iterator first, iterator last)
:删除[first, last)
范围内的元素,时间复杂度同样为O(n)。
- 获取元素:
at(size_type n)
:返回索引为n
的元素,会进行边界检查,如果越界会抛出std::out_of_range
异常。时间复杂度为O(1)。operator[](size_type n)
:返回索引为n
的元素,不进行边界检查,越界访问会导致未定义行为。时间复杂度为O(1)。front()
:返回vector的第一个元素。时间复杂度为O(1)。back()
:返回vector的最后一个元素。时间复杂度为O(1)。
reserve方法优化性能场景
reserve(size_type n)
方法用于预先分配至少能容纳n
个元素的内存空间。当我们事先知道vector最终需要容纳多少元素时,使用reserve
可以避免在添加元素过程中频繁的内存重新分配和数据拷贝,从而提升性能。例如,在需要向vector中添加大量元素的场景下,如果不使用reserve
,每次容量不足时,vector会重新分配内存(通常是原来容量的两倍),并将原来的数据拷贝到新的内存位置,这一过程时间复杂度较高。而使用reserve
预先分配足够的内存,可以将多次内存重新分配和数据拷贝减少为一次,提高效率。
代码示例
#include <iostream>
#include <vector>
int main() {
std::vector<int> myVector;
myVector.reserve(10);
for (int i = 0; i < 10; ++i) {
myVector.push_back(i);
}
for (int num : myVector) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}