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元素。