vectoer erase 问题

jianghong78670 2008-07-31 09:52:32
我想问下如下代码是否隐藏错误
os:linux
g++
code:

vector<char *> abcs;
for(i=0;i<abcs.size();i++)
{
if(i<abcs.size() && i>=0 && abcs.size()>0)
{
abcs.erase(i+abcs.begin());
i--;
}
}
...全文
158 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
jianghong78670 2008-08-01
  • 打赏
  • 举报
回复
本问题结论:

下面方法:在数据量的情况下 是很难发现问题,但其实是不对的
vector <char *> abcs;
for(i=0;i <abcs.size();i++)
{
if(i <abcs.size() && i>=0 && abcs.size()>0)
{
abcs.erase(i+abcs.begin());
i--;
}
}
应该如下:
vector <char *> abcs;
vector<char *>::iterator iter;
for(iter = abcs.begin();iter != abcs.end();)
{
if(abcs.size()>0)
{
iter=abcs.erase(iter);
}
}
jianghong78670 2008-07-31
  • 打赏
  • 举报
回复
谢谢 这个已经注意到了;
[Quote=引用 21 楼 guzhilei1986 的回复:]
引用 19 楼 e_sharp 的回复:
vector <char *> abcs;

------------------------------

vector中是指针,要释放指针指向的内容。

就是哦,不然要浪费内存的哦。
[/Quote]
guzhilei1986 2008-07-31
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 e_sharp 的回复:]
vector <char *> abcs;

------------------------------

vector中是指针,要释放指针指向的内容。
[/Quote]
就是哦,不然要浪费内存的哦。
hai040 2008-07-31
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 jianghong78670 的回复:]
对于vectoer stl 需要删除一个指定的元素,怎么做最好呢?
引用 14 楼 hai040 的回复:
效率低
每次循环都要调用一次size,没办法用变量代替
每次删除都要调用一次begin并移动i次指针
[/Quote]
remove/erase惯用法
http://stl.winterxy.com/html/item_09.html
e_sharp 2008-07-31
  • 打赏
  • 举报
回复
vector <char *> abcs;

------------------------------

vector中是指针,要释放指针指向的内容。
jianghong78670 2008-07-31
  • 打赏
  • 举报
回复
对于vectoer stl 需要删除一个指定的元素,怎么做最好呢?
[Quote=引用 14 楼 hai040 的回复:]
效率低
每次循环都要调用一次size,没办法用变量代替
每次删除都要调用一次begin并移动i次指针
[/Quote]
jianghong78670 2008-07-31
  • 打赏
  • 举报
回复
是的 if(i <abcs.size() && i>=0 && abcs.size()>0) 这句判断有点多余
hai040 2008-07-31
  • 打赏
  • 举报
回复
iter = abcs.erase(iter);


没问题的,你那句判断是肯定成立的,i肯定在0到size之间
abcs[i]肯定有效
jianghong78670 2008-07-31
  • 打赏
  • 举报
回复
更大量的测试也是不能发现问题的,但非常大的量时,就说不准了[Quote=引用 11 楼 coverallwangp 的回复:]
C/C++ code
#include <vector>
#include <iostream>
using namespace std;

void main()
{
int a = 2;
vector <int> abcs;

abcs.push_back(1);
abcs.push_back(2);
abcs.push_back(2);
abcs.push_back(1);
abcs.push_back(3);
abcs.push_back(2);


for(int i=0;i <abcs.size();i++)
{
if(abcs[i]==a)
{
if(i <ab…
[/Quote]
hai040 2008-07-31
  • 打赏
  • 举报
回复
效率低
每次循环都要调用一次size,没办法用变量代替
每次删除都要调用一次begin并移动i次指针
jianghong78670 2008-07-31
  • 打赏
  • 举报
回复
上面的if(abcs.size()>0))
{
abcs.erase(iter++);
}
应该为:
jianghong78670 2008-07-31
  • 打赏
  • 举报
回复
如果有问题 应该是:iterator 操作erase前需要重新指定的问题;
比如map类型示例
map<int,classname *> abcs;
map<int,classname *>::iterator iter;
int a = 2;
for(iter = abcs.begin();iter != abcs.end();)
{
if(iter->first == a)
{
if(meetMap.size()>0))
{
abcs.erase(iter++);
}
}
else
{
++iter;
}
}
这样类似处理,就避免iter erase删除,会出现问题;但对于vector 做以上处理,该怎么考虑呢
coverallwangp 2008-07-31
  • 打赏
  • 举报
回复

#include <vector>
#include <iostream>
using namespace std;

void main()
{
int a = 2;
vector <int> abcs;

abcs.push_back(1);
abcs.push_back(2);
abcs.push_back(2);
abcs.push_back(1);
abcs.push_back(3);
abcs.push_back(2);


for(int i=0;i <abcs.size();i++)
{
if(abcs[i]==a)
{
if(i <abcs.size() && i>=0 && abcs.size()>0)
{
abcs.erase(i+abcs.begin());
i--;
}
}
}

for(int j=0;j <abcs.size();j++)
{
cout<<abcs[j]<<endl;
}

}


程序输出1 1 3
说明没有问题。
jianghong78670 2008-07-31
  • 打赏
  • 举报
回复
如果仅仅是想删除全部元素应该执行:abcs.clear 即可
问题修正下:
int a = 2;
vector <char *> abcs;
//开始给abcs赋值
...........
for(i=0;i <abcs.size();i++)
{
if(abcs[i]==a)
{
if(i <abcs.size() && i>=0 && abcs.size()>0)
{
abcs.erase(i+abcs.begin());
i--;
}
}
}
这样问题是否存在问题呢?
hai040 2008-07-31
  • 打赏
  • 举报
回复
效率最低的清除法,有更低的吗?
jianghong78670 2008-07-31
  • 打赏
  • 举报
回复
g++可以编译通过 os:red hat 9.0
hai040 2008-07-31
  • 打赏
  • 举报
回复
那句判断是多余的
int+iterator编译能过?
pengxn 2008-07-31
  • 打赏
  • 举报
回复
编译没办法通过

abcs.erase(i+abcs.begin()); 需要修改为
abcs.erase(abcs.begin()+1);


然后就可以正常删除所有元素了
长安宁 2008-07-31
  • 打赏
  • 举报
回复
abcs.erase(i+abcs.begin());
i--; 始终在擦除第一个字节
coverallwangp 2008-07-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 coverallwangp 的回复:]
有问题。
不可能把vector里面的所有元素都删除了。
[/Quote]

还有个i--没看见不好意思。
那应该是可以都删除。
加载更多回复(3)

64,654

社区成员

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

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