Как узнать, присутствует ли элемент в std :: vector?

[g0] Существует три перегрузки [f1], которые принимают разные параметры: [f2], [f3] и [f4]. Вы можете увидеть это в выходных данных компилятора. [/G0] [g1] Если вы вызываете [f5] с целочисленным параметром, таким как [f6], целое число может быть приведено к любому из этих трех типов. Так какая функция должна быть вызвана? Компилятор не знает. Это неоднозначно, поэтому вы получаете ошибку, которая заставляет вас явно выбрать желаемую перегрузку. Просто приведите параметр, чтобы он соответствовал одной из перегрузок, например: [f7]. [/G1]
570
задан Antonio 2 November 2017 в 20:43
поделиться

6 ответов

Можно использовать std::find от <algorithm>:

#include <vector>
vector<int> vec; 
//can have other data types instead of int but must same datatype as item 
std::find(vec.begin(), vec.end(), item) != vec.end()

Это возвращает bool (true если существующий, false иначе). С Вашим примером:

#include <algorithm>
#include <vector>

if ( std::find(vec.begin(), vec.end(), item) != vec.end() )
   do_this();
else
   do_that();
854
ответ дан varsh 3 November 2017 в 06:43
поделиться

Примите во внимание, что, если Вы собираетесь быть выполнением большого количества поисков, существуют контейнеры STL, которые лучше для этого. Я не знаю, каково Ваше приложение, но ассоциативные контейнеры как станд.:: карта может быть достойной рассмотрения.

станд.:: вектор является предпочтительным контейнером, если у Вас нет причины для другого, и поиски значением могут быть такой причиной.

10
ответ дан David Thornley 3 November 2017 в 06:43
поделиться

Как другие сказали, используйте STL find или find_if функции. Но если Вы ищете в очень больших векторах, и это влияет на производительность, можно хотеть отсортировать вектор и затем использовать binary_search , lower_bound , или upper_bound алгоритмы.

106
ответ дан Brian Neal 3 November 2017 в 06:43
поделиться
  • 1
    Я должен сказать, that' s невероятно впечатляющая разбивка пользовательского CATransform3D. Хорошая работа. – Brad Larson♦ 4 March 2010 в 02:04

Используйте находят от заголовка алгоритма stl. Я проиллюстрировал его использование с международным типом. Можно использовать любой тип, который Вы любите, пока можно выдержать сравнение для равенства (перегрузка ==, если Вы должны для своего пользовательского класса).

#include <algorithm>
#include <vector>

using namespace std;
int main()
{   
    typedef vector<int> IntContainer;
    typedef IntContainer::iterator IntIterator;

    IntContainer vw;

    //...

    // find 5
    IntIterator i = find(vw.begin(), vw.end(), 5);

    if (i != vw.end()) {
        // found it
    } else {
        // doesn't exist
    }

    return 0;
}
46
ответ дан isanae 3 November 2017 в 06:43
поделиться
  • 1
    Привет Kenny. Я думаю, что понимаю Вашу точку. но у меня есть проблема с реализацией: CATransform3D sublayerTransform = CATransform3DIdentity;//sublayerTransform.m11 = P;//!!!!! здесь я должен сделать что-то с m11, m14, m22... право??? и как я должен найти P, Q, R.. imageLayer.contents = (идентификатор) [[UIImage imageNamed: @" сцена jpg"] CGImage]; [слой addSublayer:imageLayer]; layer.sublayerTransform = sublayerTransform; – Dmitry 1 March 2010 в 10:49

Использование STL находит функция.

Имеют в виду, что существует также функция find_if, которую можно использовать, если поиск более сложен, т.е. если Вы только ищете элемент, но, например, хотите, видят, существует ли элемент, который выполняет определенное условие, например, строка, которая запускается с "abc". (find_if дал бы Вам итератор, который указывает на первое на такой элемент).

8
ответ дан Frank 3 November 2017 в 06:43
поделиться

Я лично использовал шаблоны в последнее время для обработки нескольких типов контейнеров сразу, а не соглашения только с векторами. Я нашел подобный пример онлайн (не может помнить, где), таким образом, кредит переходит к тому, от кого бы ни я воровал это. Этот конкретный шаблон, кажется, обрабатывает необработанные массивы также.

template <typename Container, typename T = typename std::decay<decltype(*std::begin(std::declval<Container>()))>::type>
bool contains(Container && c, T v)
{
    return std::find(std::begin(c), std::end(c), v) != std::end(c);
}
0
ответ дан 22 November 2019 в 22:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: