c++基础有关问题,等待高手解答
c++基础问题,等待高手解答
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);
}
输出

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 . . .
------解决方案--------------------
for 循环改成这样。
------解决方案--------------------
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循环的++,还是可以遍历。
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);
}
输出
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循环的++,还是可以遍历。