Могу ли я проверить итератор C++ на null?

у меня проблемы с векторными итераторами. Я читал в нескольких местах, что проверка нулевых итераторов невозможна, и что обычный способ проверить итераторы-проверить его против вектора.end () после поиска. Так например:

vector< Animal* > animalList;

vector<Animal*>::iterator findInList(const type_info& type)
{
    // Loop through list of Animals, if Dog found, return iterator to it
}

auto it = findInList(typeid(Dog));
// With a pointer I can check if it's null, but with an iterator I have to check against animalList.end();

проблема в том, что контейнер может быть пустым. С итератором я не могу вернуть null, чтобы указать пустой контейнер или сбой поиска. Я могу вернуть vector:: end (), но cplusplus.com говорит:

If the container is empty, vector::end() function returns the same as vector::begin()

и затем для vector:: begin () он говорит:

If the container is empty, the returned iterator value shall not be dereferenced.

поэтому, если у меня есть пустой контейнер, vector::end() и vector::begin() указывают на одно и то же место, я не думаю, что могу разыменовать его, и я даже не уверен, что он указывает на выделенную память.

Edit: спасибо всем. Как вы итерировали, vector:: end() или vector:: begin() не разыменуйте итератор, я могу безопасно проверить против vector:: end().

3 ответов


вам не нужно проверять, является ли iterator нулевым, потому что он никогда не будет. Вам нужно проверить, отличается ли возвращаемый итератор от контейнеров end() положении. Если это так, вы можете безопасно разыменовать итератор на *it.

если контейнер пуст, возвращаемое значение итератора не должно быть разыменовано. Поэтому, если у меня есть пустой контейнер, vector:: end () и vector:: begin () указывают на одно и то же место, я не думаю, что могу разыменовать его, и я даже не уверен, что это указывает на выделенную память.

нет, проверка if(myIt != container.end()) это не разыменование итератора. Разыменование итератора *myIt, что означает получение значения объекта, на который указывает итератор. Всегда безопасно проверять итераторы на другие итераторы из одного контейнера, небезопасно разыменовывать итератор, не указывая на элементы контейнеров.


нет, вы не можете проверить значение NULL, потому что это не указатель. Вернуться, а также проверить против animalList.end(). Только если итератор не равен end() вы должны разыменовать его.


просто проверьте вот так

auto it = findInList( someInfo );

if ( it == animalList.end() ) std::cout << "not found";