2009-04-02 3 views
1

У меня есть программа, которая нравится этаКогда STL-итератор будет равен нулю?

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() .. Какое возможное решение для этого ...?

+0

Почему вы не можете сравнить его с «alist.end() "? Кажется, это логично. –

ответ

8

Почему, по вашему мнению, итератор никогда не будет «нулевым»? Итераторы не являются указателями или индексами. Если вам нужно проверить, пустой ли контейнер, используйте функцию empty().

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 - это не определенное состояние для итератора.

+3

Второй очень плохой - размер() разрешен для O (N) для списков. Используйте empty() везде, где вы сравниваете size() с 0. –

1

Может быть, вы хотите, чтобы проверить, является ли содержание итератора равно 0. В этом случае ... вам нужно изменить что-то вроде:

list<int>::iterator n = alist.begin(); 
while(!alist.empty() && 0 != *n) 
{ 
    printf("Element is %d\n",*n); 
    n = alist.erase(n); 
} 
Смежные вопросы