【C++容器】Vector使用全览

这篇文章是关于 C++所有数据结构概览中的 list 特辑
往期 STL 容器看点:

首先,请确保包含了头文件:

#include <vector>

1. 构造函数 (Constructors)

用于创建和初始化一个 vector

  • vector()

    • 功能:默认构造函数,创建一个空的 vector
    • 示例std::vector<int> v1;
  • vector(size_type count, const T& value)

    • 功能:创建包含 count 个元素的 vector,每个元素都被初始化为 value

    • 示例std::vector<int> v2(5, 10); // 创建包含 5 个 int 的 vector,每个都是 10

  • vector(size_type count) (C++11 起)

    • 功能:创建包含 count 个元素的 vector,并对每个元素进行值初始化(对于 int 等内置类型,就是零初始化)。

    • 示例std::vector<int> v3(5); // 创建包含 5 个 int 的 vector,每个都是 0

  • vector(InputIt first, InputIt last)

    • 功能:使用迭代器范围 [first, last) 内的元素来构造 vector

    • 示例int arr[] = {1, 2, 3, 4, 5}; std::vector<int> v4(arr, arr + 5);

  • vector(const vector& other)

    • 功能:拷贝构造函数,创建一个与 other 内容相同的 vector

    • 示例std::vector<int> v5(v4);

  • vector(vector&& other) (C++11)

    • 功能:移动构造函数,接管 other 的资源,other 将变为空。这比拷贝高效。

    • 示例std::vector<int> v6(std::move(v5));

  • vector(std::initializer_list<T> init) (C++11)

    • 功能:使用初始化列表来构造 vector。这是最现代、最常用的方式之一。

    • 示例std::vector<int> v7 = {1, 2, 3, 4, 5};


2. 迭代器 (Iterators)

用于遍历 vector 中的元素。

  • begin() / cbegin()

    • 功能:返回指向 vector 第一个元素的迭代器。cbegin() 返回一个 const 迭代器。
  • end() / cend()

    • 功能:返回指向 vector 尾端(最后一个元素的下一个位置)的迭代器。cend() 返回一个 const 迭代器。
  • rbegin() / crbegin()

    • 功能:返回指向 vector 最后一个元素的反向迭代器。
  • rend() / crend()

    • 功能:返回指向 vector 第一个元素之前位置的反向迭代器。

示例

std::vector<int> v = {10, 20, 30};
// 正向遍历
for(auto it = v.begin(); it != v.end(); ++it) {
    std::cout << *it << " "; // 输出: 10 20 30
}
// 反向遍历
for(auto it = v.rbegin(); it != v.rend(); ++it) {
    std::cout << *it << " "; // 输出: 30 20 10
}

3. 容量 (Capacity)

管理 vector 的存储空间。

  • size()

    • 功能:返回 vector 中实际元素的数量。
  • capacity()

    • 功能:返回在不重新分配内存的情况下,vector 可以容纳的元素数量。capacity() >= size() 恒成立。
  • empty()

    • 功能:检查 vector 是否为空(即 size() == 0),返回 truefalse
  • reserve(size_type new_cap)

    • 功能预留存储空间。请求将 capacity() 增加到至少 new_cap。如果 new_cap 大于当前的 capacity(),会发生内存重分配。这是一个重要的性能优化技巧,可以避免在连续 push_back 时发生多次内存重分配。
  • shrink_to_fit() (C++11)

    • 功能:请求减少 capacity() 以匹配 size(),释放未使用的内存。
  • resize(size_type count)

    • 功能:改变 vector 的大小。如果 count > size(),则在末尾添加新元素(值初始化);如果 count < size(),则销毁末尾多余的元素。
  • resize(size_type count, const T& value)

    • 功能:同上,但在扩容时使用 value 作为新元素的初始值。

示例

std::vector<int> v;
v.reserve(100); // 预分配100个元素的空间,避免后续push_back重分配
std::cout << "Size: " << v.size() << ", Capacity: " << v.capacity() << std::endl; // Size: 0, Capacity: 100

v.push_back(1); v.push_back(2);
std::cout << "Size: " << v.size() << ", Capacity: " << v.capacity() << std::endl; // Size: 2, Capacity: 100

v.resize(10);
std::cout << "Size: " << v.size() << ", Capacity: " << v.capacity() << std::endl; // Size: 10, Capacity: 100

v.shrink_to_fit();
std::cout << "Size: " << v.size() << ", Capacity: " << v.capacity() << std::endl; // Size: 10, Capacity: 10

4. 元素访问 (Element Access)

获取 vector 中的单个元素。

  • operator[](size_type pos)

    • 功能:访问指定位置 pos 的元素。不进行边界检查,速度快但有风险。
  • at(size_type pos)

    • 功能:访问指定位置 pos 的元素。进行边界检查,如果 pos 超出范围,会抛出 std::out_of_range 异常。更安全。
  • front()

    • 功能:返回对第一个元素的引用。
  • back()

    • 功能:返回对最后一个元素的引用。
  • data() (C++11)

    • 功能:返回指向底层连续内存数组的指针。可用于与需要原始指针的 C 风格 API 交互。

示例

std::vector<int> v = {10, 20, 30, 40};
int first = v[0];       // first = 10
int second = v.at(1);   // second = 20
int last = v.back();    // last = 40
// v.at(10); // 会抛出异常
// int* p = v.data(); // p 指向数组 {10, 20, 30, 40}

5. 修改器 (Modifiers)

改变 vector 的内容。

  • assign(size_type count, const T& value)

    • 功能:销毁 vector 中所有元素,并用 countvalue 填充。
  • assign(InputIt first, InputIt last)

    • 功能:销毁 vector 中所有元素,并用迭代器范围 [first, last) 的内容填充。
  • push_back(const T& value) / push_back(T&& value)

    • 功能:在 vector 的末尾添加一个元素。这是最常用的操作之一。
  • pop_back()

    • 功能:移除 vector 的最后一个元素。
  • insert(const_iterator pos, const T& value) (以及其他重载)

    • 功能:在迭代器 pos 指向的位置之前插入元素。可以插入单个元素、多个相同元素、一个迭代器范围的元素。这是一个 O(n) 操作。
  • erase(const_iterator pos) / erase(const_iterator first, const_iterator last)

    • 功能:移除迭代器 pos 指向的元素,或迭代器范围 [first, last) 内的元素。这是一个 O(n) 操作。
  • emplace_back(Args&&... args) (C++11)

    • 功能:在 vector 末尾就地构造一个元素,而不是先创建临时对象再拷贝。对于复杂对象,这比 push_back 更高效。
  • emplace(const_iterator pos, Args&&... args) (C++11)

    • 功能:在迭代器 pos 指向的位置之前就地构造一个元素。
  • swap(vector& other)

    • 功能:与另一个 vector 交换内容。这是一个 O(1) 的高效操作,它只交换内部指针。
  • clear()

    • 功能:移除所有元素,size() 变为 0,但 capacity() 通常不变。

示例

std::vector<int> v = {10, 20, 30};

v.push_back(40); // v: {10, 20, 30, 40}
v.pop_back();    // v: {10, 20, 30}

auto it = v.begin() + 1; // 指向 20
v.insert(it, 15);      // v: {10, 15, 20, 30}

v.erase(v.begin());    // v: {15, 20, 30}

std::vector<int> v2;
v2.swap(v);            // v2: {15, 20, 30}, v: {}

v2.clear();            // v2: {}

6. 非成员函数 (Non-member functions)

  • 比较运算符 (==, !=, <, >, <=, >=)

    • 功能:以字典序比较两个 vector 的内容。
  • std::swap(vector& a, vector& b)

    • 功能:与成员函数 swap 等效,推荐使用这个非成员版本。
  • std::erase(vector<T>& c, const U& value) (C++20)

    • 功能:移除 c 中所有等于 value 的元素。
  • std::erase_if(vector<T>& c, UnaryPredicate p) (C++20)

    • 功能:移除 c 中所有使一元谓词 p 返回 true 的元素。

C++20 示例

#if __cplusplus >= 202002L
std::vector<int> v = {1, 2, 3, 2, 4, 2, 5};
std::erase(v, 2); // v 变为 {1, 3, 4, 5}

std::vector<int> v2 = {1, -2, 3, -4, 5};
std::erase_if(v2, [](int x){ return x < 0; }); // v2 变为 {1, 3, 5}
#endif

这份列表涵盖了 std::vector 的几乎所有日常使用和性能调优所需的操作。掌握它们,尤其是容量管理和修改器函数,是高效使用 std::vector 的关键。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值