如何检查一个元素是否在集合中?
是否有与以下代码更简单的等效代码:
myset.find(x) != myset.end()
如何检查一个元素是否在集合中?
是否有与以下代码更简单的等效代码:
myset.find(x) != myset.end()
当前回答
我使用
if(!my_set.count(that_element)) //Element is present...
;
但它的效率不如
if(my_set.find(that_element)!=my_set.end()) ....;
我的版本只是节省了我写代码的时间。对于竞争性编码,我更喜欢这种方式。
其他回答
我能够为std::list和std::vector编写一个通用的包含函数,
template<typename T>
bool contains( const list<T>& container, const T& elt )
{
return find( container.begin(), container.end(), elt ) != container.end() ;
}
template<typename T>
bool contains( const vector<T>& container, const T& elt )
{
return find( container.begin(), container.end(), elt ) != container.end() ;
}
// use:
if( contains( yourList, itemInList ) ) // then do something
这样可以稍微清理一下语法。
但是我不能使用模板模板参数魔术使此工作任意stl容器。
// NOT WORKING:
template<template<class> class STLContainer, class T>
bool contains( STLContainer<T> container, T elt )
{
return find( container.begin(), container.end(), elt ) != container.end() ;
}
任何关于改进上一个答案的评论都是很好的。
您还可以在插入元素时检查元素是否在set中。 单元素版本返回一个pair,其成员pair::first set指向一个迭代器,该迭代器要么指向新插入的元素,要么指向集合中已经存在的等效元素。如果插入了新元素,pair中的第二个元素将被设置为true,如果已经存在等效元素则为false。
例如:假设集合中已经有20作为元素。
std::set<int> myset;
std::set<int>::iterator it;
std::pair<std::set<int>::iterator,bool> ret;
ret=myset.insert(20);
if(ret.second==false)
{
//do nothing
}
else
{
//do something
}
it=ret.first //points to element 20 already in set.
如果元素是新插入的,则than pair::first将指向新元素在set中的位置。
在c++ 20中,我们最终得到std::set::contains方法。
#include <iostream>
#include <string>
#include <set>
int main()
{
std::set<std::string> example = {"Do", "not", "panic", "!!!"};
if(example.contains("panic")) {
std::cout << "Found\n";
} else {
std::cout << "Not found\n";
}
}
从c++ 20开始,就有了bool std::contains(const K&) https://en.cppreference.com/w/cpp/container/set/contains
检查许多STL容器是否存在的典型方法,如std::map, std::set,…是:
const bool is_in = container.find(element) != container.end();