如何找出一个项目是否存在于std :: vector中?

我所要做的就是检查vector中是否存在一个元素,这样我就可以处理每个case。

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

你可以使用<algorithm> std::find

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

这将返回一个布尔(如果存在,则返回true ,否则返回false )。 用你的例子:

 #include <algorithm> if ( std::find(vector.begin(), vector.end(), item) != vector.end() ) do_this(); else do_that(); 

正如其他人所说,使用STL findfind_if函数。 但是,如果您search的vector非常大,并且会影响性​​能,则可能需要对vector进行sorting,然后使用binary_searchlower_boundupper_boundalgorithm。

从stl的algorithm头中使用find。我已经用inttypes说明了它的用法。 只要你能比较平等就可以使用你喜欢的任何types(如果你需要为你的自定义类加载,则可以使用过载==)。

 #include <algorithm> #include <vector> using namespace std; int main() { typedef vector<int> 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; } 

如果您的vector没有sorting,请使用MSNbuild议的方法:

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

如果你的向量是有序的,使用binary_search方法Brian Nealbuild议:

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

二进制search产生O(log n)最坏情况的性能,这比第一种方法更有效率。 为了使用二进制search,你可以使用qsort来sortingvector,以保证它是有序的。

我使用这样的东西…

 #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 

…就这样,它实际上清晰可读。 (显然你可以在多个地方重复使用模板)。

请记住,如果您要进行大量的查找,那么有更好的STL容器。 我不知道你的应用程序是什么,但像std :: map这样的关联容器可能是值得考虑的。

std :: vector是select的容器,除非你有另一个理由,并且按值查找可能是这样一个原因。

使用STL 查找function。

请记住,还有一个find_if函数,如果你的search更复杂的话,你可以使用这个函数,也就是说,如果你不只是寻找一个元素,但是,例如,想要看看是否有一个元素满足一定的条件,例如,以“abc”开头的string。 ( find_if会给你一个指向第一个这样的元素的迭代器)。

你可以试试这个代码:

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

在C ++ 11中,你可以使用any_of 。 例如,如果它是一个vector<string> v; 然后:

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

这是一个适用于任何Container的函数:

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

请注意,您可以使用1个模板参数,因为您可以从容器中提取value_type 。 您需要types名称,因为Container::value_type是从属名称 。

有了boost,你可以使用any_of_equal

 #include <boost/algorithm/cxx11/any_of.hpp> bool item_present = boost::algorithm::any_of_equal(vector, element); 

如果你想在vector中find一个string:

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

你也可以使用计数。 它会返回一个向量中的项目数量。

 int t=count(vec.begin(),vec.end(),item); 

另一个使用C ++操作符的示例。

 #include <vector> #include <algorithm> #include <stdexcept> template<typename T> inline static bool operator ==(const std::vector<T>& v, const T& elem) { return (std::find(v.begin(), v.end(), elem) != v.end()); } template<typename T> inline static bool operator !=(const std::vector<T>& 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_ID> 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!"); } } 
 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; } 

您可以使用std命名空间中的find函数,即std::find 。 将std::find函数传递给要search的向量的beginend迭代器,以及要查找的元素,并将生成的迭代器与向量的末尾进行比较,以查看它们是否匹配。

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

你也可以解引用这个迭代器,像其他任何迭代器一样使用它。