“可变大小”数组,存储对象,类模板(定义时需要指明存储对象的类型)。
这里只专门介绍一些vector的操作,vector是顺序容器,所以vector同样支持所有顺序容器的特性。
vector是顺序容器,支持顺序容器的所有操作。
一、初始化、赋值
vector<int> ivec; // ivec 保存 int 类型的对象
vector<Sales_item> Sales vec; // 保存 Sales_item 类型的对象
vector<vector<string>> file; // 该 向量的元素是 vector 对象
vector<T> v1 // v1 是一个空vector,它潜在的元素是T类型的,执行默认初始化
vector<T> v2(v1) // v2 中包含有v1所有元素的副本
vector<T> v2 = v1; // 与上等价
vector<T> v3(n, val) // v3 包含了n个重复的元素,每个元素的值都是val
vector<T> v4(n) // v4 包含了n个重复地执行了值初始化的对象
vector<T> v5{a,b,c...} // v5 包含了初始值个数的元素,每个元素被赋予相应的初始值
vector<T> v5={a,b,c...} // 与上等价
int int_arr[] = {0, 1, 2, 3, 4, 5}; // 标准库函数begin,end函数见下面
vector<int> ivec(begin(int_arr), end(int_arr));// 数组初始化vector,反过来就不行。
vector<int> ivec(int_arr + 1, int_arr_3); // 数组部分初始化
vector<string> v2("a", "an", "the") ; // 错误,要用花括号
vector<string> v6("hi"); // 错误:不能使用字符串宇面值构建 vector 对象
vector<string> v7{10}; // v7有10个默认初始化的元素
vector<string> v8{10, "hi"}; // v8有10个值为"hi"的元素
二、vector其他操作
vector一般没必要初始化指定大小,因为push_back是高效的。
vector<type>::size_tpe v.size() // 返回v中元素的个数
v.empty() // 如果v不含有任何元素,返回真:否则返回假
v.push_back(t) // 向v的尾端添加一个值为t的元素
v[n] // 返回v中第n个的“引用”,下标类型size_type
// 只能访问,不能插入元素
v1 = v2 // 用v2中元素的拷贝替换vl中的元素
v1 = {a, b, c ...} // 用列表中元素的拷贝替换vl中的元素
v1 == v2 // vl和v2相等当且仅当它们的元素数量相同且对应位置的元素值都相同
v1 != v2 // 所有标准库容易都定义了!=、==
<, <= , >, >= // 顾名思义,以字典顺序进行比较
// 只有少数标准容器定义了。
vector<int>::size_type = t.size(); // 正确
auto sizetype = t.size();
vector::size_type = t.size(); // 错误
三、空间如何增长
vector想象成一个桶,桶装不下的时候,不是简单换一个大小+1的桶,而是根据分配策略分配一个大比较多的桶,省得马上又满了。
// shrink_to_fit 只适用于vector、string和deque。
// capacity和reserve 只适用于vector和string 。
c.shrink_to_fit(); // 请将capacity()减少为与size()相同大小,只是请求。
// 理解:请求换一个刚刚能装满的桶
c.capacity(); // 不重新分配内存空间的话,c可以保存多少元素
// 理解:当前这个桶能装多少水
c.size(); // 理解:桶现在装了多少水。
c.reserve(n); // 分配至少能容纳n个元素的空间,可能会触发内存重新分配
// reserve并不改变容器中元素的数量,它仅影响预先分配至少多大的内存空间
// 理解:桶计划要装n这么多水,你考虑下要不要换,换多大的。