1. vector的初始化。

C++ primer列出了几种初始化vector对象的方式:

①vector<T> v1;

②vector<T> v2(v1); v2初始化为v1的一个副本。

③vector<T> v3(n,i); v3包含n个值为i的元素。

④vector<T> v4(n); v4含有值初始化的元素的n个副本。

另外,vector可以这样初始化:

vector<int> ivec{ 1,2,3 };  
vector<int> ivec2 = { 1,2,3 };  

vector也可以这样初始化:

int an_array[] = { 5,6,7,8 };
vector<int> an_vector(an_array, an_array + 4);

用已存在的数组元素来初始化vector。传给vector的an_array和an_array+4(指针作为数组的迭代器)指示把范围 [an_array,an_array+4)内的元素用来初始化an_vector。注意an_array+4中的4是数组an_array的长度,而an_array+4是超出末端迭代器。这样an_vector的元素初始化为an_array的副本。

也可以只取数组中一部分用来初始化an_vector:

int an_array[] = { 5,6,7,8 };
vector<int> an_vector(an_array + 1, an_array + 3);
//an_vector:{6,7}

则an_vector初始化得到两个元素,6和7。

可以用数组的迭代器初始化vector,当然也可以用已经存在的vector初始化vector:

vector<int> an_vector1{ 2,3,4,5,6 };
vector<int> an_vector2(an_vector1.begin(), an_vector1.end());

这样an_vector2初始化为an_vector1的一个副本。同样也可以只取an_vector1部分元素:

vector<int> an_vector1{ 2,3,4,5,6 };
vector<int> an_vector2(an_vector1.begin() + 1, an_vector1.begin() + 4);

则an_vector2={3,4,5}。

除了可以用vector迭代器指定部分元素来初始化新的vector,也可以用set的迭代器来初始化vector:

set<int> an_set1{ 2,3,4,5,6 };
vector<int> an_vector2(an_set1.begin(), an_set1.end());

这样也是合法的。

但是由于set并没有定义+和-操作,所以没有办法用set.iterator+n的方式获取某范围内的元素,比如这样

set<int> an_set1{ 2,3,4,5,6 };

vector<int> an_vector2(an_set1.begin()+1, an_set1.end());

这样的操作是错误的。不过set定义了迭代器的自加++和自减++,所以还是可以用迭代器遍历set元素。