如何找出一个项目是否存在于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 find
或find_if
函数。 但是,如果您search的vector非常大,并且会影响性能,则可能需要对vector进行sorting,然后使用binary_search
, lower_bound
或upper_bound
algorithm。
从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的向量的begin
和end
迭代器,以及要查找的元素,并将生成的迭代器与向量的末尾进行比较,以查看它们是否匹配。
std::find(vector.begin(), vector.end(), item) != vector.end()
你也可以解引用这个迭代器,像其他任何迭代器一样使用它。