我要作的就是檢查向量中是否存在某個元素,所以我能夠處理每種狀況。 性能
if ( item_present ) do_this(); else do_that();
您能夠嘗試如下代碼: 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() }
若是沒有訂購您的向量,請使用建議的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首先對向量進行排序以確保其排序。 排序
若是您想在向量中找到一個字符串: 字符串
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));
我用這樣的東西... 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
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; }