Как проверить, что итератор STL указывает на что-нибудь?

Возможный дубликат:
С++ Лучший способ проверить, действительно ли итератор

Я хочу сделать что-то вроде этого:

std::vector<int>::iterator it;
// /cut/ search for something in vector and point iterator at it. 
if(!it) //check whether found
    do_something(); 

Но оператора нет! для итераторов. Как я могу проверить, указывает ли итератор на что-либо?

Ответы

Ответ 1

Вы не можете. Обычная идиома - использовать конечный итератор контейнера как маркер "не найден". Это то, что возвращает std::find.

std::vector<int>::iterator i = std::find(v.begin(), v.end(), 13);
if (i != v.end())
{
     // ...
}

Единственное, что вы можете сделать с неназначенным итератором, это присвоить ему значение.

Ответ 2

Хотя итераторы считаются общей формой указателей, они не являются точно указателями. Стандарт определяет итератор Past-the-end, чтобы указать на ошибку поиска в контейнерах. Следовательно, не рекомендуется проверять итераторы на NULL

Past-the-end значения неособые и непередаваемые.

if(it != aVector.end())  //past-the-end iterator
    do_something();

Ответ 3

Если вы хотите использовать итератор в цикле, самый безопасный способ его использования заключается в следующем:

for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it)
{
 do_smth();
}

Ответ 4

Я считаю, что это должно дать вам хороший тест:

if (iterator._Mycont == &MyContainer)
{
Probably a valid iterator!
}

Вы можете сделать тесты, чтобы убедиться, что итератор не равен концу...

iterator != MyContainer.end()

и

iterator >= MyContainer.begin()