やりたいことは、ベクトルに要素が存在するかどうかを確認することだけなので、それぞれのケースに対処できます。
if ( item_present )
do_this();
else
do_that();
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();
ベクトルが順序付けされていない場合は、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 を使用してベクトルをソートし、順序付けを保証することができます。
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();
以下は、どのコンテナでも機能する関数です。
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
が必要です。
ブーストを使用すると、次を使用できますany_of_equal
。
#include <boost/algorithm/cxx11/any_of.hpp>
bool item_present = boost::algorithm::any_of_equal(vector, element);
このコードを試すことができます:
#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()
}
名前空間にあるfind
関数を使用できます。探している要素とともに、検索するベクターの関数と反復子を渡し、結果の反復子をベクターの末尾と比較して、それらが一致するかどうかを確認します。std
std::find
std::find
begin
end
std::find(vector.begin(), vector.end(), item) != vector.end()
そのイテレータを逆参照して、他のイテレータと同様に通常どおり使用することもできます。
template <typename T> bool IsInVector(const T & what, const std::vector<T> & vec)
{
return std::find(vec.begin(),vec.end(),what)!=vec.end();
}
ベクトル内の文字列を検索する場合:
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));