Как искать элемент в векторе? - PullRequest
6 голосов
/ 22 ноября 2010

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

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

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

Ответы [ 3 ]

12 голосов
/ 22 ноября 2010

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

if (p != v.end()) {
   std::cout << "v[" << (p - v.begin()) << "] = ";
   std::cout << *p << std::endl;
}
4 голосов
/ 22 ноября 2010

Если 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.

1 голос
/ 22 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...