MST

星途 面试题库

面试题:C++顺序容器之vector的操作技巧

请简述C++中vector的常见操作,如添加元素、删除元素、获取元素等,并说明在什么场景下使用reserve方法可以优化性能。同时,写一段代码示例,创建一个vector,向其中添加10个整数,并输出所有元素。
23.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

C++中vector常见操作

  1. 添加元素
    • push_back(T value):在vector的末尾添加一个元素value。时间复杂度平均为O(1),因为当vector容量不足时需要重新分配内存,此时时间复杂度为O(n)。
    • insert(iterator position, T value):在指定位置position插入元素value。时间复杂度为O(n),因为插入位置之后的元素都需要移动。
  2. 删除元素
    • pop_back():删除vector末尾的元素。时间复杂度为O(1),因为不需要移动其他元素。
    • erase(iterator position):删除指定位置position的元素。时间复杂度为O(n),因为删除位置之后的元素都需要移动。erase(iterator first, iterator last):删除[first, last)范围内的元素,时间复杂度同样为O(n)。
  3. 获取元素
    • 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;
}