-
vector:表示可动态开辟空间的数组的序列容器。(在尾部插入或删除元素更加高)
-
vector的三种遍历:
-
opreator[ ]
for (size_t i=0;i<v.size( );i++){
cout << v[i] << " ";
}
cout << endl;
- (反向)(const)迭代器;使用迭代器进行修改
注意:迭代器中的区间问题:左闭右开
vector <int> :: iterator it = v.begin( );
while (it != v.end( )){
cout << *it << " ";
it++;
}
cout << endl;
vector <int> :: reverse iterator it = v.rbegin( );
while (it != v.rend( )){
cout << *it << " ";
it ++;
}
cout <<endl;
vector <int> :: iterator it = v.begin( );
while (it != v.end( )){
*it = 10;//把vector中的元素全部修改为10。
cout << *it << " ";
it++;
}
cout << endl;
- 范围for
for (auto e:v){
cout << e << " ";
}
cout << endl;
- 迭代器失效问题:
int a[]={1,2,3,4};
vector <int> v2 = (a,sizeof(a)/sizeof(int));
vector <int>::iterator pos = find(v2.begin( ),v2.end( ),3);
v2.erase(pos);
v2.insert(pos,10);
删除pos位置的数据;在pos位置插入数据都会导致迭代器失效。
其中**insert导致迭代器失效是因为增容(如下图所示)**:
删除v2中所有偶数的问题中,也存在着迭代器失效的问题:(参考下图)
可利用erase中的返回值解决。(返回值为当前元素的下一个位置)
int a[]={1,2,10,3,4};
vector <int> v2(a,a+sizeof(a)/sizeof(int));
vector <int>::iterator it = v2.begin( );
while (it != v2.end( )){
if (*it % 2 == 0){
v2.erase(it);
it++;
}
因此,代码应改为:
while (it != v2.end( )){
if (*it % 2 == 0)
it = v2.erase(it);
else
it++;
}
-
Reverse和Resize的区别:
-
Reverse只负责开空间(即,只改变capacity)
-
Resize在开空间的同时进行初始化。
-
clear的用法及手动释放空间。
vector <int> v1;
v1.pushback(1);
v1.pushback(2);
v1.pushback(3);
v1.pushback(4);
v1.pushback(5);
cout << v1.size( ) << endl;
cout << v1.capacity( ) << endl;
v1.clear( );
cout << v1.size( ) << endl;
cout << v2.capacity( ) << endl;
结果如图所示:
结论:用clear释放vector的空间,只改变size的值,不改变capacity。
手动释放vector的空间,可利用swap函数。
vector <int> v1;
v1.pushback(1);
v1.pushback(2);
v1.pushback(3);
v1.pushback(4);
v1.pushback(5);
cout << v1.size( ) << endl;
cout << v1.capacity( ) << endl;
vector <int> tmp;//构造一个空的Vector:tmp
v1.swap(tmp);
cout << v1.size( ) << endl;
cout << v1.capacity( ) << endl;
结果如图所示: