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

c++基础问题,等待高手解答
本帖最后由 ncistcn 于 2013-09-02 20:13:43 编辑

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


int _tmain(int argc, _TCHAR* argv[])
{
std::list<int> ls;
ls.push_back(3);

std::list<int>::iterator p = ls.begin();

printf("%d\n", ls.begin());
printf("%d\n", p);
printf("%d\n", *ls.begin());
printf("%d\n", *p);

printf("%d, %d\n", ls.begin(), p);
printf("%d, %d\n", *ls.begin(), *p);

printf("%d, %d\n", ls.begin(), *ls.begin());
printf("%d, %d\n", p, *p);
}


输出
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循环的++,还是可以遍历。