如何找出std :: vector中是否存在項目?

我要作的就是檢查向量中是否存在某個元素,所以我能夠處理每種狀況。 性能

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

#1樓

您能夠嘗試如下代碼: this

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

#2樓

若是沒有訂購您的向量,請使用建議的MSN方法: spa

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

若是您的向量是有序的,請使用binary_search方法Brian Neal建議: code

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

二進制搜索產生O(log n)最壞狀況的性能,比第一種方法更有效。 爲了使用二進制搜索,您可使用qsort首先對向量進行排序以確保其排序。 排序


#3樓

若是您想在向量中找到一個字符串: 字符串

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));

#4樓

我用這樣的東西... string

#include <algorithm>


template <typename T> 
const bool Contains( std::vector<T>& 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

...那樣其實是清晰易讀的。 (顯然,您能夠在多個地方重複使用模板)。 it


#5樓

template <typename T> bool IsInVector(T what, std::vector<T> * vec)
{
    if(std::find(vec->begin(),vec->end(),what)!=vec->end())
        return true;
    return false;
}
相關文章
相關標籤/搜索