726

やりたいことは、ベクトルに要素が存在するかどうかを確認することだけなので、それぞれのケースに対処できます。

if ( item_present )
   do_this();
else
   do_that();
4

17 に答える 17

1075

std::find次から使用できます<algorithm>

#include <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()

これは、見つかった最初の要素への反復子を返します。存在しない場合は、イテレータを 1 つ後ろに戻します。あなたの例では:

#include <algorithm>
#include <vector>

if ( std::find(vec.begin(), vec.end(), item) != vec.end() )
   do_this();
else
   do_that();
于 2009-02-20T22:00:50.537 に答える
51

ベクトルが順序付けされていない場合は、MSN が提案するアプローチを使用します。

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

ベクトルが順序付けられている場合は、Brian Neal が提案した binary_search メソッドを使用します。

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

二分探索は、O(log n) の最悪の場合のパフォーマンスをもたらします。これは、最初のアプローチよりもはるかに効率的です。二分探索を使用するには、最初に qsort を使用してベクトルをソートし、順序付けを保証することができます。

于 2012-11-23T08:58:39.277 に答える
22

C++11 では、 を使用できますany_of。たとえば、vector<string> v;then の場合:

if (any_of(v.begin(), v.end(), bind(equal_to<string>(), _1, item)))
   do_this();
else
   do_that();

または、ラムダを使用します。

if (any_of(v.begin(), v.end(), [&](const std::string& elem) { return elem == item; }))
   do_this();
else
   do_that();
于 2015-08-11T04:15:57.720 に答える
13

以下は、どのコンテナでも機能する関数です。

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

value_typeコンテナからを抽出できるため、1 つのテンプレート パラメータで済むことに注意してください。従属名typenameであるためContainer::value_typeが必要です。

于 2016-02-11T21:38:51.830 に答える
8

STL検索機能を使用します。

検索がより複雑な場合、つまり要素を探しているだけでなく、たとえば、特定の要素を満たす要素があるかどうかを確認したい場合に使用できるfind_if関数もあることに注意してください。条件。たとえば、「abc」で始まる文字列。(find_if最初のそのような要素を指すイテレータを提供します)。

于 2009-02-20T22:18:34.877 に答える
7

ブーストを使用すると、次を使用できますany_of_equal

#include <boost/algorithm/cxx11/any_of.hpp>

bool item_present = boost::algorithm::any_of_equal(vector, element);
于 2016-09-27T16:02:37.367 に答える
5

このコードを試すことができます:

#include <algorithm>
#include <vector>

// You can use class, struct or primitive data type for Item
struct Item {
    //Some fields
};
typedef std::vector<Item> 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()
}
于 2012-04-28T15:29:48.190 に答える
4

名前空間にあるfind関数を使用できます。探している要素とともに、検索するベクターの関数と反復子を渡し、結果の反復子をベクターの末尾と比較して、それらが一致するかどうかを確認します。stdstd::findstd::findbeginend

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

そのイテレータを逆参照して、他のイテレータと同様に通常どおり使用することもできます。

于 2014-06-15T00:36:20.523 に答える
3
template <typename T> bool IsInVector(const T & what, const std::vector<T> & vec)
{
    return std::find(vec.begin(),vec.end(),what)!=vec.end();
}
于 2014-01-26T17:55:40.613 に答える
1

ベクトル内の文字列を検索する場合:

    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));
于 2013-05-31T13:55:53.397 に答える