2013-03-27 4 views
3

Я хочу знать, если следующая проверка необходима:Проверьте указатель итератора в C++

std::list<int> myList; 
..... 
for (std::list<int>::iterator itr = myList.begin(); itr != myList.end(); ++itr) 
{ 
    if (itr != NULL) // Is This Check Necessary? 
    { 
     // DO SOMTHING. 
    }  
} 

Я видел этот чек в некоторых местах, и мне интересно, если это является необходимым проверить. Возможно, эта проверка необходима, если список является входом в функцию?

Спасибо, Ofer.

ответ

4

Нет, это лишняя проверка. Возможно, вы захотите проверить *itr != nullptr, если в списке есть какие-то указатели.

+0

В STL итератор установлен в конце итератора коллекции, чтобы указать различные отрицательные случаи возврата в функциях. –

2

Нет, это не обязательно. Я не уверен, что это действительно справедливо.

+0

Это не так, потому что 'std :: list :: iterator' не может быть реализован как указатель. –

+0

Это, по крайней мере, неспортивное, я не уверен, что реализация может позволить это как расширение. @MichaelWild: Верно, но все равно может сравниться с одним, например. с 'std :: list :: итератором :: operator! = (void *)' – MSalters

+0

@MSalters Я предполагаю, что реализация будет разрешена для этого. Но с чем это сравнится? Элемент связи? –

1

Вместо этого вы можете использовать новый диапазон, основанный на циклах (C++ 11), поэтому вам не нужно иметь дело с проверкой итератора.

std::list<int> YourList; 
for(auto z : YourList) { 
// 
std::cout << z;  // z is int 
// amazing codes and fun :) 
// 
} 
1

Это ненужно check.If MyList пусто, то myList.begin() равен myList.end()

1

Я думаю, что нет никакого способа, чтобы проверить, если итератор неинициализированный, Но вы можете инициализировать итератор до конца() контейнера в качестве значения по умолчанию.

std::list<int>::iterator itr = yourlist.end(); 
// 
if (itr != yourlist.end()) 
{ 
    //doSomething 
} 
Смежные вопросы