2015-11-26 3 views
-4

Я хочу проверить, существует ли элемент в векторе или нет, поэтому я могу иметь дело с каждым случаем. я наткнулся на эту формулу:Поиск элемента в std :: vector

#include <algorithm> 

if (std::find(vector.begin(), vector.end(), item) != vector.end()) 
    do_this(); 
else 
    do that(); 

Я не понимаю, почему мы должны vector.end() в конце концов, разве найти (vector.begin(), vector.end(), п) достаточно, чтобы найти элемент?

+2

Возможно, вам потребуется прочитать ссылку, например, например. [этот] (http://en.cppreference.com/w/cpp/algorithm/find). Вам особенно нужно прочитать, что 'std :: find' возвращает в случае, если вещь, которую вы ищете, не найдена. –

ответ

3
std::find(vector.begin(), vector.end(), item) 

вернет итератор, поэтому, сравнивая его

vector.end() 

вы фактически проверка, чтобы увидеть, если такой итератор с этим элементом существует.

1

Я не понимаю, почему мы должны vector.end() в конце концов, разве находка (vector.begin(), vector.end(), п) достаточно, чтобы найти элемент?

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

find был разработан как универсальный алгоритм, который работает на самых разных контейнерах (включая даже те, которые потенциально находятся за пределами стандартной библиотеки). Он также предназначен для просто большего, чем возврат, был ли найден элемент или нет - он возвращает итератор, указывающий на элемент, если он найден. В результате он не возвращает нуль или что-то в этом роде, если ему не удается найти элемент. Он возвращает итераторы.

Если вы действительно такого рода вещи много (и я только рекомендую делать что-нибудь подобное, если вы делаете, так как вы вводите что-то чуждое ежедневного кода), вы можете сделать что-то вроде этого:

/// @return True if `val` is found in `[first, last)` 
template <class Iterator, class Element> 
bool contains(Iterator first, Iterator last, const Element& val) 
{ 
    return std::find(first, last, val) != last; 
} 

... 
if (contains(vector.begin(), vector.end(), item)) 
    do_this(); 
else 
    do_that(); 
0

Он проверяет, действительно ли значение было найдено или нет.
std :: find() возвращает итератор первому элементу в диапазоне запросов.
Если возвращаемое значение равно vector.end(), это означает, что он не нашел товар.
Для получения дополнительной информации см. this.

Смежные вопросы