Как проверить, что итератор 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()