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

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

if ( item_present )
   do_this();
else
   do_that();
вопрос задан 20.02.2009
Joan Venge
94882 репутация

17 ответов


  • 765 рейтинг

    Вы можете использовать std::find из :

    std::find(vector.begin(), vector.end(), item) != vector.end()
    

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

    #include 
    
    if ( std::find(vector.begin(), vector.end(), item) != vector.end() )
       do_this();
    else
       do_that();
    
    ответ дан MSN, с репутацией 43569, 20.02.2009
  • 99 рейтинг

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

    ответ дан Brian Neal, с репутацией 24274, 20.02.2009
  • 44 рейтинг

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

    #include 
    #include 
    
    using namespace std;
    int main()
    {   
        typedef vector 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;
    }
    
    ответ дан m-sharp, с репутацией 10595, 20.02.2009
  • 33 рейтинг

    Если ваш вектор не упорядочен, используйте подход, предложенный MSN:

    if(std::find(vector.begin(), vector.end(), item)!=vector.end()){
          // Found the item
    }
    

    Если ваш вектор упорядочен, используйте метод binary_search, предложенный Брайаном Нилом:

    if(binary_search(vector.begin(), vector.end(), item)){
         // Found the item
    }
    

    бинарный поиск дает O (log n) производительность в худшем случае, что намного эффективнее, чем первый подход. Чтобы использовать двоичный поиск, вы можете использовать qsort, чтобы сначала отсортировать вектор, чтобы гарантировать его упорядоченность.

    ответ дан Think Recursively, с репутацией 1573, 23.11.2012
  • 18 рейтинг

    Я использую что-то вроде этого. , ,

    #include 
    
    
    template  
    const bool Contains( std::vector& Vec, const T& Element ) 
    {
        if (std::find(Vec.begin(), Vec.end(), Element) != Vec.end())
            return true;
    
        return false;
    }
    
    if (Contains(vector,item))
       blah
    else
       blah
    

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

    ответ дан Andy Krouwel, с репутацией 666, 4.09.2013
  • 9 рейтинг

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

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

    ответ дан David Thornley, с репутацией 49572, 20.02.2009
  • 8 рейтинг

    В C ++ 11 вы можете использовать any_of. Например, если это vector v;, то:

    if (any_of(v.begin(), v.end(), bind2nd(equal_to(), item)))
       do_this();
    else
       do_that();
    
    ответ дан Deqing, с репутацией 7150, 11.08.2015
  • 7 рейтинг

    Используйте функцию STL find .

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

    ответ дан Frank, с репутацией 27789, 20.02.2009
  • 5 рейтинг

    Вы можете попробовать этот код:

    #include 
    #include 
    
    // You can use class, struct or primitive data type for Item
    struct Item {
        //Some fields
    };
    typedef std::vector ItemVector;
    typedef ItemVector::iterator ItemIterator;
    //...
    ItemVector vtItem;
    //... (init data for vtItem)
    Item itemToFind;
    //...
    
    ItemIterator itemItr;
    itemItr = std::find(vtItem.begin(), vtItem.end(), itemToFind);
    if (itemItr != vtItem.end()) {
        // Item found
        // doThis()
    }
    else {
        // Item not found
        // doThat()
    }
    
    ответ дан TrungTN, с репутацией 1774, 28.04.2012
  • 5 рейтинг

    Вот функция, которая будет работать для любого контейнера:

    template  
    const bool contains(const Container& container, const typename Container::value_type& element) 
    {
        return std::find(container.begin(), container.end(), element) != container.end();
    }
    

    Обратите внимание, что вы можете обойтись без 1 параметра шаблона, потому что вы можете извлечь value_type из контейнера. Вам нужен typename, потому что Container::value_type является зависимым именем .

    ответ дан Martin Broadhurst, с репутацией 7707, 11.02.2016
  • 4 рейтинг

    С бустом вы можете использовать any_of_equal :

    #include 
    
    bool item_present = boost::algorithm::any_of_equal(vector, element);
    
    ответ дан Mikhail, с репутацией 12083, 27.09.2016
  • 3 рейтинг

    Вы можете использовать функцию find , которая находится в пространстве имен std, т.е. std::find. Вы передаете функции std::find итератор begin и end из вектора, который вы хотите найти, вместе с элементом, который вы ищете, и сравниваете полученный итератор с концом вектора, чтобы увидеть, совпадают они или нет.

    std::find(vector.begin(), vector.end(), item) != vector.end()
    

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

    ответ дан TankorSmash, с репутацией 8491, 15.06.2014
  • 3 рейтинг

    Вы можете использовать счет тоже. Он вернет количество элементов, присутствующих в векторе.

    int t=count(vec.begin(),vec.end(),item);
    
    ответ дан Aditya, с репутацией 107, 11.03.2015
  • 2 рейтинг

    Другой пример с использованием операторов C ++.

    #include 
    #include 
    #include 
    
    template
    inline static bool operator ==(const std::vector& v, const T& elem)
    {
      return (std::find(v.begin(), v.end(), elem) != v.end());
    }
    
    template
    inline static bool operator !=(const std::vector& v, const T& elem)
    {
      return (std::find(v.begin(), v.end(), elem) == v.end());
    }
    
    enum CODEC_ID {
      CODEC_ID_AAC,
      CODEC_ID_AC3,
      CODEC_ID_H262,
      CODEC_ID_H263,
      CODEC_ID_H264,
      CODEC_ID_H265,
      CODEC_ID_MAX
    };
    
    void main()
    {
      CODEC_ID codec = CODEC_ID_H264;
      std::vector codec_list;
    
      codec_list.reserve(CODEC_ID_MAX);
      codec_list.push_back(CODEC_ID_AAC);
      codec_list.push_back(CODEC_ID_AC3);
      codec_list.push_back(CODEC_ID_H262);
      codec_list.push_back(CODEC_ID_H263);
      codec_list.push_back(CODEC_ID_H264);
      codec_list.push_back(CODEC_ID_H265);
    
      if (codec_list != codec)
      {
        throw std::runtime_error("codec not found!");
      }
    
      if (codec_list == codec)
      {
        throw std::logic_error("codec has been found!");
      }
    }
    
    ответ дан Valdemar_Rudolfovich, с репутацией 1932, 13.05.2016
  • 2 рейтинг

    Если вы хотите найти строку в векторе:

        struct isEqual
    {
        isEqual(const std::string& s): m_s(s)
        {}
    
        bool operator()(OIDV* l)
        {
            return l->oid == m_s;
        }
    
        std::string m_s;
    };
    struct OIDV
    {
        string oid;
    //else
    };
    VecOidv::iterator itFind=find_if(vecOidv.begin(),vecOidv.end(),isEqual(szTmp));
    
    ответ дан Gank, с репутацией 3926, 31.05.2013
  • 1 рейтинг
    template  bool IsInVector(T what, std::vector * vec)
    {
        if(std::find(vec->begin(),vec->end(),what)!=vec->end())
            return true;
        return false;
    }
    
    ответ дан user3157855, с репутацией 70, 26.01.2014
  • 0 рейтинг

    Используя Newton C ++ , это проще, самодокументировано и быстрее, чем с std :: find из-за прямого возврата bool

    bool exists_linear( INPUT_ITERATOR first, INPUT_ITERATOR last, const T& value )
    
    bool exists_binary( INPUT_ITERATOR first, INPUT_ITERATOR last, const T& value )
    

    Я думаю, это очевидно, что делают функции.

    include 
    
    if ( newton::exists_linear(first, last, value) )
       do_this();
    else
       do_that();
    
    ответ дан Moises Rojo, с репутацией 141, 11.04.2018