一个关于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;
}
}

恳请各位帮忙,感激不尽。
...全文
197 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
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;

64,654

社区成员

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

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