Как искать элемент в векторе?
У меня есть такой код....
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())
прямо перед линией отображения.