关于容器的问题

秋天的晨阳 2012-10-11 03:43:04
例如vit是指向ivec.begin()的迭代器
那么
vit=ivec.erase(vit);//删除元素
--vit;//指向删除元素的前一元素


我理解的是用erase删除元素后返回的迭代器指向的应该还是ivec.begin()



使用--vit后 ivec.begin()的前一个元素是什么?
...全文
95 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
漫步者、 2012-10-12
  • 打赏
  • 举报
回复
cout<<"--iter="<<*iter<<endl


你去操作了一个受保护的内存地址
若风09 2012-10-12
  • 打赏
  • 举报
回复
begin()函数返回一个指向当前vector起始元素的迭代器.而erase函数的返回值是指向删除的元素的下一位置的迭代器.也就是说
vit = ivec.begin();
vit=ivec.erase(vit);//删除元素,此时vit是ivec第二个位置的迭代器
--vit;//此处确实越界了,但是我刚才网上查了下好像标准库中,vector本来就没有设计越界检查 ,所以这里没有报错,但是当你 cout的时候就会发现其实找不到这个元素,就报错了 ;应该是这样理解

秋天的晨阳 2012-10-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
如果是输入要删除的是第一个时。就会出现错误。
你可以自己设置断点调试一下。
[/Quote]
我试了不会出错除非我将
// cout<<"--iter="<<*iter<<endl;
的//去掉 才会出错
我就是想知道为什么
l0g1n 2012-10-11
  • 打赏
  • 举报
回复
如果是输入要删除的是第一个时。就会出现错误。
你可以自己设置断点调试一下。
l0g1n 2012-10-11
  • 打赏
  • 举报
回复
执行这句后iter=lis.erase(iter);
iter指针所指向的位置是不发生变化的,只是list中后面的数据依次前移。
如序列为
a b c d e f g
当输入删除c后,序列为
a b d e f g
iter指向d。
执行--iter后,iter指向b。
秋天的晨阳 2012-10-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

你可以看做数组或者链表,采取删除操作时向首部靠近,begin()的前一个,是越界了嘛。
[/Quote]

#include<iostream>
#include<list>
#include<string>
using namespace std;
int main()
{
//将list对象读入元素
string str;
list<string> lis;
while(cin>>str)
lis.push_back(str);
cin.clear();//将输入流置于有效状态
//输入要查找的值
cout<<"请输入"<<endl;
cin>>str;
//处理list对象,删除与str相同的元素
for(list<string>::iterator iter=lis.begin();
iter!=lis.end();++iter)
{
if(*iter==str)
{
iter=lis.erase(iter);
cout<<*iter<<endl;
--iter;
// cout<<"--iter="<<*iter<<endl;
}
}
return 0;
}

为什么越界了不显示错误啊
漫步者、 2012-10-11
  • 打赏
  • 举报
回复
你可以看做数组或者链表,采取删除操作时向首部靠近,begin()的前一个,是越界了嘛。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧