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