Когда итератор STL будет равен нулю? - PullRequest
2 голосов
/ 02 апреля 2009

У меня есть программа, похожая на эту

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 ]

8 голосов
/ 02 апреля 2009

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

3 голосов
/ 02 апреля 2009

Измените это на

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

1 голос
/ 02 апреля 2009

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

list<int>::iterator n = alist.begin();
while( !alist.empty() && 0 != *n) 
{
    printf("Element is %d\n",*n);
    n = alist.erase(n);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...