首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

c++基础有关问题,等待高手解答

2013-09-07 
c++基础问题,等待高手解答1244992//printf(%d\n, ls.begin())1244992//printf(%d\n, p)3//printf(%

c++基础问题,等待高手解答


1244992//printf("%d\n", ls.begin());
1244992//printf("%d\n", p);
3//printf("%d\n", *ls.begin());
3//printf("%d\n", *p);
1244992, 1244972//printf("%d, %d\n", ls.begin(), p);为什么不是 1244992, 1244992
3, 3//printf("%d, %d\n", *ls.begin(), *p);
1244992, 1244740//printf("%d, %d\n", ls.begin(), *ls.begin());为什么不是 1244992, 3
1244992, 0//printf("%d, %d\n", p, *p);为什么不是 1244992, 3
Press any key to continue . . .

c++
[解决办法]
for 循环改成这样。


 for (; p != ls.end();)
 {
  if (*p == 3)
  {
   p = ls.erase(p);
  }
  else
  {
   ++p;
  }
 }

[解决办法]
ls.erase(p--);
erase() 会使迭代器失效。
p--虽然考虑了用副本去实现delete,保存了前一个元素的迭代器。碰到begin()的时候,有可能出问题。
我在vs2010下用ls.erase(p--)没出问题,跟list的实现有关,list的begin()再--的时候是会成为end()的,2010的list的实现是一个循环链表。

最稳妥的办法是这样
p = ls.erase(p);
--p;
这样就可以了。
erase返回p的后一个元素的迭代器,再--就成前一个,经过for循环的++,还是可以遍历。

热点排行