#include <vector> using std::vector;
vector常用的初始化方法为:
// 默认初始化: v不含任何元素, 但是只能添加类型T的元素 vector<T> v1; // 拷贝初始化: v2中包含v1所有元素的副本 vector<T> v2 = v1; vector<T> v2(v1); // 初始化指定数量元素 vector<T> v1(n, val); // 包含n个值为val的元素 vector<T> v1(n); // 包含n个执行了值初始化(内置类型零初始化, 类类型默认构造函数初始化)的元素 // 列表初始化 vector<T> v1 {a, b, c}; vector<T> v1 = {a, b, c};
注意vector的圆括号与花括号初始化是不同的:圆括号是通过调用vector的构造函数进行初始化的,如果使用了花括号那么初始化过程会尽可能会把花括号内的值当做元素初始值的列表来处理。如果初始化时使用了花括号但是提供的值又无法用来列表初始化,那么就考虑用这些值来调用vector的构造函数了。
#include <string> #include <vector> int main() { std::vector<std::string> v1{"tomo", "cat", "tomocat"}; // 列表初始化: 包含3个string元素的vector // std::vector<std::string> v2("a", "b", "c"); // 错误: 找不到合适的构造函数 std::vector<std::string> v3(10, "tomocat"); // 10个string元素的vector, 每个string初始化为"tomocat" std::vector<std::string> v4{10, "tomocat"}; // 10个string元素的vector, 每个string初始化为"tomocat" std::vector<int> v5(10); // 10个int元素, 每个都初始化为0 std::vector<int> v6{10}; // 1个int元素, 该元素的值时10 std::vector<int> v7(10, 1); // 10个int元素, 每个都初始化为1 std::vector<int> v8{10, 1}; // 2个int元素, 值分别是10和1 }
push_back 负责把一个值加到vector对象的尾端:
push_back
// 初始化一个空vector对象, 依次将0~99 vector<int> vi; for (int i = 0; i != 100; ++i) { vi.push_back(i); }
v.empty() // v中不含有任何元素时返回true v.size() // 返回v中元素数量 v[n] // 返回v中第n个位置上元素的引用 v1 == v2 v1 != v2 // v1和v2相等当且仅当它们的元素数量相同且对应位置的元素值相同 <, <=, >, >= // 以字典顺序进行比较
在范围for循环中预存了 end() 的值,一旦在序列中添加(删除)元素,那么 end() 函数的值就可能变得无效了。
end()
Tips:vector与string等对象的下标运算符可用于访问已存在的元素,但不能用于添加元素。确保下标有效的一种有效手段就是尽可能地使用范围for语句。