Как искать элемент в векторе?

У меня есть такой код....

std::vector<string>::iterator p;
p =  find(v.begin(),v.end(),"asdasda"); 
cout << *p << endl;

если "asdasda" не является частью вектора, p указывает на некоторый мусор, а cout дает ошибку seg. каким должен быть оператор if, который заставит cout выполнить только если" asdasda " была найдена? а также положение "asdasda" в В.. как если бы мы ранее объявили v[3] как " asdasda", тогда как я могу знать, от найти, что V[3] - это "asdasda"?

3 ответов


p не указывают на "мусор", он просто становится v.end() когда содержимое не найдено.

if (p != v.end()) {
   std::cout << "v[" << (p - v.begin()) << "] = ";
   std::cout << *p << std::endl;
}

если std::find ничего не находит, итератор установлен в v.end() в этом случае.

if ( p != v.end() )
{
    // iterator is good
}

Также обратите внимание на общий случай std::find.

вот типичное определение:

namespace std {
  template <class InputIterator, class T>
  InputIterator find(InputIterator start, 
                     InputIterator finish,
                     const T& value);
}

в случае std::find не удается, он вернет finish итератор, потому что поиск [start, finish) и включает в себя start но не finish.


find возвращает итератор end, если он не находит значение, которое вы ищите. Вы можете избежать ошибки, добавив if (p != v.end()) прямо перед линией отображения.