vector的迭代器失效问题及手动释放空间。

  • 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;

结果如图所示:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值