vector 容器以类模板 vector( T 表示存储元素的类型)的形式定义在 头文件中,并位于 std 命名空间中。因此,在创建该容器之前,代码中需包含如下内容:

  1. #include <vector>
  2. using namespace std;

创建vector容器

  1. // 方法1
  2. std::vector<double> values;
  3. // 方法2
  4. std::vector<int> primes {2,3,4,5,6};
  5. // 方法3
  6. std::vector<double> values(20);
  7. // 方法4, 长度20,初始值0.1
  8. std:::vector<double> values(20,0.1);
  9. // 通过存储元素类型相同的其它 vector 容器,也可以创建新的 vector 容器
  10. std::vector<char>value1(5, 'c');
  11. std::vector<char>value2(value1);

注意,圆括号 () 和大括号 {} 是有区别的,前者(例如 (20) )表示元素的个数,而后者(例如 {20} ) 则表示 vector 容器中只有一个元素 20。

vector的成员函数

函数成员 函数功能
begin() 返回指向容器中第一个元素的迭代器。
end() 返回指向容器最后一个元素所在位置后一个位置的迭代器,通常和 begin() 结合使用。
rbegin() 返回指向最后一个元素的迭代器。
rend() 返回指向第一个元素所在位置前一个位置的迭代器。
cbegin() 和 begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
cend() 和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
crbegin() 和 rbegin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
crend() 和 rend() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改元素。
size() 返回实际元素个数。
max_size() 返回元素个数的最大值。这通常是一个很大的值,一般是 232-1,所以我们很少会用到这个函数。
resize() 改变实际元素的个数。
capacity() 返回当前容量。
empty() 判断容器中是否有元素,若无元素,则返回 true;反之,返回 false。
reserve() 增加容器的容量。
shrink _to_fit() 将内存减少到等于当前元素实际所使用的大小。
operator[ ] 重载了 [ ] 运算符,可以向访问数组中元素那样,通过下标即可访问甚至修改 vector 容器中的元素。
at() 使用经过边界检查的索引访问元素。
front() 返回第一个元素的引用。
back() 返回最后一个元素的引用。
data() 返回指向容器中第一个元素的指针。
assign() 用新元素替换原有内容。
push_back() 在序列的尾部添加一个元素。
pop_back() 移出序列尾部的元素。
insert() 在指定的位置插入一个或多个元素。
erase() 移出一个元素或一段元素。
clear() 移出所有的元素,容器大小变为 0。
swap() 交换两个容器的所有元素。
emplace() 在指定的位置直接生成一个元素。
emplace_back() 在序列尾部生成一个元素。

当然,如果通过调用 reserve() 来增加内存,任何现有的迭代器,例如开始迭代器和结束迭代器,都会失效,所以需要重新生成它们。这是因为,为了增加容器的容量,vector 容器的元素可能已经被复制或移到了新的内存地址。
NeatReader-1648215079884.png

  1. #include <iostream>
  2. #include <vector>
  3. int main()
  4. {
  5. std::vector<char> value;
  6. value.push_back('S');
  7. value.push_back('T');
  8. value.push_back('L');
  9. for (auto i = value.begin(); i < value.end(); i++)
  10. {
  11. std::cout << *i << std::endl;
  12. }
  13. // 向容器开头插入字符
  14. value.insert(value.begin(), 'C');
  15. for (auto i = value.begin(); i < value.end(); i++)
  16. {
  17. std::cout << *i << std::endl;
  18. }
  19. return 0;
  20. }

vector容器迭代器的基本用法

2.9