• 全部
  • 问答

一个关于STL容器删除的问题。

liuhaochuan 2005-12-02 03:21:21
基本思想是建立了一个命令队列,当发现队列里有COM_CANCEL命令时,就删除前面的所有命令。

问题是: 如论如何都删除不了想删除的东西。

代码如下:
typedef std::list<CCommand_Object> CommandContainer;

for(CommandContainer::iterator it=m_Commands.begin();it!=m_Commands.end();++it)
{
if(it->m_Name==COM_CANCEL)
{
it = m_Commands.erase(m_Commands.begin(),it);
return;
}
}

恳请各位帮忙,感激不尽。
...全文
149 点赞 收藏 16
写回复
16 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
dragonzxh 2005-12-02
C++标准程序库P170
earse(beg,end)//移除[beg;end]之间的所有元素,返回下一元素位置
回复
liuhaochuan 2005-12-02
RE: boodweb(TTT)

谢谢指点。结帖给分。
回复
liuhaochuan 2005-12-02
for(CommandContainer::iterator it=m_Commands.begin();it!=m_Commands.end();++it)
{
if(it->m_Name==COM_CANCEL)
{
it = m_Commands.erase(m_Commands.begin(),++it);
}
}
最后改成这样就可以了。 但感觉好象不太好。
回复
boodweb 2005-12-02
erase(begin,last)删除的是[begin,last),不包含last本身

if(it->m_Name==COM_CANCEL)
{
it++;
it = m_Commands.erase(m_Commands.begin(),it);
}
这个代码没有越界的危险,it++最多使it变为m_Commands.end()
估计还是楼主概念不清,嘿嘿
回复
dragonzxh 2005-12-02
似乎跟迭代器有关
++it 向前步进(传回新位置)
it++ 向前步进(传回旧位置)
回复
liuhaochuan 2005-12-02
RE: fangrk(加把油,伙计!)


输出是5,我想要的是,把5和5以前的统统删掉。
回复
liuhaochuan 2005-12-02
if(it->m_Name==COM_CANCEL)
{
it++;
it = m_Commands.erase(m_Commands.begin(),it);
}

这样写就可以了,但为什么不能按照预期的操作呢而且这样有越界的危险,谁能告诉在下如何做才对。
回复
睡在床板下_ 2005-12-02
it->m_Name 估计是这里错的把,it 是个迭代器,不是 对象啊~~
list 和vector的迭代器 是不同的啊~~
楼主 可以用vector试试行不行~~~?
回复
fangrk 2005-12-02
list<int> L;
for(int i=0;i<10;++i) L.push_back(i);
L.erase(L.begin(),find(L.begin(),L.end(),5));
cout<<* L.begin();

输出是什么?
回复
dragonzxh 2005-12-02
调试一下看看迭代器的位置好了。。。这样说很难看出来有什么错,语法上应该没有错。。
回复
liuhaochuan 2005-12-02
it = m_Commands.erase(m_Commands.begin(),it);
你是说这句,书上说erase动作以后返回的是下一个元素的iterator,如果照此说法应该不需return可以完成整个容器的处理,但实际上erase没有删除掉我想删除的元素。我想会不会是因为erase动作打乱了iterator,所以加了个return做测试。
回复
dragonzxh 2005-12-02
有,删除[begin;end]之间的元素,返回下一位置
回复
睡在床板下_ 2005-12-02
我不是很清楚,我想问下,list中 有 erase(begin,end); 的函数吗??
我很少用 stl
回复
dragonzxh 2005-12-02
请问楼主想删除什么?
不太理解
it = m_Commands.erase(m_Commands.begin(),it);
return;
删除了[m_Commands.begin(),it]之间的元素,然后再返回it的后一个元素有什么意义?后面都直接return了。。。
回复
liuhaochuan 2005-12-02
no no no 我想删除的是前面所有的
回复
jingyueid 2005-12-02
m_Commands.erase(it);
return;
回复
发帖
C++ 语言
创建于2007-09-28

5.9w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
帖子事件
创建了帖子
2005-12-02 03:21
社区公告
暂无公告