2010-08-10 2 views
175

Можно создать дубликат:
How to find an item in a std::vector?проверить, если std :: vector содержит определенный объект?

Есть ли что-то в <algorithm>, которая позволяет проверить, является ли станд :: контейнер содержит что-то? Или способ сделать один, например:

if(a.x == b.x && a.y == b.y) 
return true; 

return false; 

Может ли это быть сделано только с std::map, поскольку он использует ключи?

Благодаря

+6

std :: find ...... – sje397

+0

Если в нем есть что-то конкретное или просто не пустое? –

+2

Какую ссылку на C++ вы используете? И заголовок называется '' - примечание № .h. – 2010-08-10 15:54:40

ответ

355

Проверка v содержит элемент x:

#include <algorithm> 

if(std::find(v.begin(), v.end(), x) != v.end()) { 
    /* v contains x */ 
} else { 
    /* v does not contain x */ 
} 

Проверка v содержит элементы (не пусто):

if(!v.empty()){ 
    /* v is non-empty */ 
} else { 
    /* v is empty */ 
} 
+13

Что делать, если x является последним элементом в v? –

+52

David, end() указывает на один последний элемент, так что все работает. –

+2

Учитывает ли это числовой толерантность при попытке определить, является ли double в векторе? –

9

См вопрос: How to find an item in a std::vector?

Вы также должны убедиться, что вы внедрили подходящий operator==() для вашего объекта, если по умолчанию один не является достаточным для «глубокого» тест равенства ,

73

Если поиск для элемента важно, я бы рекомендовал std::set вместо std::vector. (Т. Е myset.find(x)): С помощью этого

std::find(vec.begin(), vec.end(), x) пробегов в O (N) времени, но std::set имеет свой собственный find() элемент, который работает в O (журнал п) - это гораздо более эффективно, с большим количеством элементов

std::set также гарантирует, что все добавленные элементы уникальны, что избавляет вас от необходимости делать что-либо вроде if not contained then push_back()....

+1

Отличный !!! Я пишу лексер. Наборы будут намного лучше, чем векторы. У 'set' есть метод' count', например 'map'? Я также хочу иметь возможность получить индекс элемента в наборе. – IAbstract

+1

Отличная информация! Спасибо за то, что вы ответили на прямой вопрос и предоставили дополнительное решение. – CodeMouse92

+3

Это плохой совет. Если производительность важна, профиль. Нет никакой гарантии, что анализ сложности может что-то сказать о вашей конкретной проблеме. –

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