STL迭代器何时等于零?

时间:2009-04-02 09:18:48

标签: c++ stl iterator

我有一个类似这样的程序

list<int>:: iterator n = alist.begin();
while(n!= (list<int>::iterator)0)
{
    printf("Element is %d\n",*n);
    n = alist.erase(n);
}

所以我在这里将迭代器与零进行比较。 但删除最后一个元素后,编译器显示此错误。

*** glibc detected *** ./new: free(): invalid pointer: 0xbf99cb10 ***
======= Backtrace: =========
/lib/libc.so.6[0xb7d956e1]
/lib/libc.so.6(cfree+0x89)[0xb7d96d79]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0xb7f3ff81]
./new[0x8048c81]
./new[0x8048ca6]
./new[0x8048d07]
./new[0x8048d39]
./new(__gxx_personality_v0+0x216)[0x804888e]
/lib/libc.so.6(__libc_start_main+0xdc)[0xb7d46f9c]
./new(__gxx_personality_v0+0x49)[0x80486c1]
======= Memory map: ========
08048000-0804a000 r-xp 00000000 08:09 3704751    /home/sathya/chaithra/archivesthrash/new

如果队列/列表为空,我希望迭代器为零..我该怎么办? 因为在我的项目中我需要将此迭代器与零进行比较,而不是与alist.end()进行比较。 可能解决这个问题的方法是什么......?

3 个答案:

答案 0 :(得分:8)

为什么你认为迭代器会“零”?迭代器不是指针或索引。如果需要检查容器是否为空,请使用empty()成员函数。

答案 1 :(得分:3)

将此更改为

list<int>:: iterator n = alist.begin();
while(n!= alist.end())
{
    printf("Element is %d\n",*n);
    n = alist.erase(n);
}

list<int>:: iterator n = alist.begin();
while(alist.size() > 0)
{
    printf("Element is %d\n",*n);
    n = alist.erase(n);
}

因为你不能将迭代器与NULL进行比较 - 这不是迭代器的已定义状态。

答案 2 :(得分:1)

也许您想测试迭代器的内容是否为0.在这种情况下......您需要更改为:

list<int>::iterator n = alist.begin();
while( !alist.empty() && 0 != *n) 
{
    printf("Element is %d\n",*n);
    n = alist.erase(n);
}