Vectors
Vector也叫container(容器)
A vector is often referred to as a container because it "contains" other objects.
包含
#include <vector>
using std::vector;
以vector为元素的vector
vector<vector<int>> numList;//vector whose elements are vector
vector<vector<int> > numList;//老版本中要求int后的“> >”这个空格必须存在,新版则不必
vector不能以reference为元素
因为reference本身并不是object,所以不能有vector of reference。
定义和初始化Vector
vector<T> v1;
vector<T> v2(v1);
vector<T> v2 = v1;
vector<T> v3(n,val);//n个val
vector<T> v4(n);//n个default initialization value
vector<T> v5{a,b,c...};//c++ 11支持
vector<T> v5 = {a,b,c...};//c++ 11支持
值得一提的是最后两个使用{}(curly braces)初始化vector是c++ 11的新特性,这里不能使用() (parentheses)。这个特性被称为雷内初始化(in-class initializer)。类内初始化其实就是对C++标准库提供的一些列变量类型提供了初始化的功能,其形式必须是“{a,b,c...}”或是" = {a,b,c...}",而不能使用圆括号。有一点值得注意,使用类内初始化,所有变量形式必须一致,即:
vector<int> iv{1,2};//ok
vector<int> iv{1.0,2.0};//error! int和double
还有一点,如果你使用了"{}',但是compiler无法根据"{}"正确编译,那么它会将其转换成"()"再尝试编译,即:
vector<string> sv{10,"a"};//等价于(10,"a")
显然,我们应该减少这种情况发生。
为vector添加元素
大家都知道,往vector内添加元素使用push_back()函数。但很多人倾向于事先给vector设定好一个大小,然后使用"[]"来添加元素。C++ Primer告诉我们,vectors grow efficiently!除非所有vector需要相同的值,否则不要这么做,而应该使用push_back;使用push_back往往比先设定好大小,然后依次读入来的效率更高。
vector和range for
一般来说,range for配合vector非常好用。然而,如果range for中要改变vector的size,则是被禁止的。这是因为,这样range for就难以判定开始和结尾了。
实际测试中(使用VS2013),编译时不会报错,但运行时会报错:vector iteration not incrementable!
其他的vector操作
v.empty();//return true if empty; otherwise false
v.size();//return size_type
v.push_back(t);
v[n];
v1 = v2;
v1 = {a,b,c...};
v1 == v2;//类模板只能是标准库中的变量类型
v1 != v2;//同上
<,<=,>,>= //同上
还有值得一提的是,vector中的size_type这个变量类型,必须指明类模板才有效,即:
vector<int> ::size_type //ok
vector:: size_type //error!
使用Array初始化Vector
我们用array初始化array,也不能用vector初始化array,但可以用array初始化vector,which is very convenient!
int a[] = {1,2,3,4,5};
vector<int> v(begin(a),end(a));//v和a的元素完全一样
vector<int> v2(begin(a)+1,end(a)-1);//v包含2,3,4