Vector
1、vector能容纳绝大多数类型的对象作为其元素,但是因为引用不是对象,所以不存在包含引用的vector
2、Vector是一个类模板,实例化
(1) Vector<int> ivec;
(2) Vector<Sales_item> Sales_vec;
(3) Vector<vector<string>> file;
3、定义和初始化vector对象
(1) Vector<T> v1;
(2) Vector<T> v2(v1);
(3) Vector<T> v2 = v1;
(4) Vector<T> v3(n, val); v3包含了n个重复的元素,每个元素的值都是val
(5) Vector<T> v4(n); v4包含了n个重复地执行了值初始化对象
(6) Vector<T> v5{a, b, c ...) v5包含了初始值个数的元素,每个元素被赋予相应的初始值
(7) Vector<T> v5 = {a, b, c ...} 等价于(6)
(6)、(7)新版本才能用(C++ 11新标准)
4、Vector操作
(1) V.empty() 如果v不含有任何元素,返回真;否则返回假
(2) V.size() 返回v中元素的个数
(3) V.push_back(t) 向v的尾端添加一个值为t的元素
(4) V[n] 返回v中第n个位置上元素的引用
(5) V1 = v2 用v2中元素的拷贝替换v1中的元素
(6) V1 == v2 v1和v2相等当且仅当它们的元素数量相同且对应位置 的元素都相同
(7) V1 != v2
(8) <, <=, >, >= 顾明思义,以字典顺序进行比较
5、迭代器 --- 提供了对对象的间接访问,其对象是容器中的元素或string对象中的字符
Auto b = v.begin(), e = v.end();
(1) 迭代器运算符
① *iter 返回迭代器所指元素的引用
② Iter->mem解引用iter并获取该元素的名为men的成员,等价于(*iter).mem
③ ++iter 令iter指示容器中的下一个元素
④ --iter 令iter指示容器中的上一个元素
⑤ Iter1 == iter2 判断两个迭代器是都相等(不相等),如果两个迭代
⑥ Iter1 != iter2 器指示的是同一个元素或者他们是同一个容器的尾后迭代器,则相等;反之,不相等。
(2) 迭代器类型
① Vector<int>::iterator it; it能读写vector<int>的元素
② String::iterator it2; it2能读写string对象中的字符
③ Vector<int>::const_iterator it3; it3只能读元素,不能写元素
④ String::const_iterator it4; it4只能读字符,不能写字符
(3) 凡是使用了迭代器的循环体,都不要向迭代器所属的容器添加元素。
(4) 使用迭代器完成一个二分搜索
Auto beg = text.begin(), end = text.end();
Auto mid = text.begin() + (end - beg) / 2;
While (mid != end && *mid != sought) {
If (sought < *mid)
End = mid;
Else
Beg = mid + 1;
Mid = beg + (end - beg) /2;
}
6、vector对象是如何增长的?
标准库实现者采用了可以减少容器空间重新分配次数的策略。当不得不获取新的内存空间时,vector和string的实现通常会分配比新的空间需求更大的内存空间。容器预留这些弓箭作为备用,可用来保存更多的新元素。这样,就不需要每次添加新元素都重新分配容器的内存空间了。
这种分配策略比每次添加新元素时都重新分配容器内存空间的策略要高效得多。其实际新能也表现得足够好——虽然vector在每次重新分配内存空间时都要移动所有元素,但使用此策略后,其扩张操作通常比list和deque还要快。
Vector的实现采用的策略似乎是在每次需要分配新内存空间是将当前容量翻倍。
7、Capacity和size
容器的size是指它已经保存的元素的数目;而capacity则是在不分配新的内存空间的前提下它最多可以保存多少元素。