我想使用我插入整数的结构,然后可以询问
if (container.contains(3)) { /**/ }
必须有这样的东西。
答案 0 :(得分:15)
您可以使用std::vector
。
std::vector<int> myVec;
myVec.push_back(3);
if (std::find(myVec.begin(), myVec.end(), 3) != myVec.end())
{
// do your stuff
}
你甚至可以做一个小帮手功能:
template <class T>
bool contains(const std::vector<T> &vec, const T &value)
{
return std::find(vec.begin(), vec.end(), value) != vec.end();
}
以下是您将如何使用它:
if (contains(myVec, 3)) { /*...*/ }
答案 1 :(得分:9)
简单算法:
template <typename Container>
bool contains(Container const& c, typename Container::const_reference v) {
return std::find(c.begin(), c.end(), v) != c.end();
}
您可以对其进行自定义,以便更有效地搜索某些已知容器:
template <typename Key, typename Cmp, typename Alloc>
bool contains(std::set<Key,Cmp,Alloc> const& s, Key const& k) {
return s.find(k) != s.end();
}
template <typename Key, typename Value, typename Cmp, typename Alloc>
bool contains(std::map<Key,Value,Cmp,Alloc> const& m, Key const& k) {
return m.find(k) != m.end();
}
通过这种方式,您可以获得一个在任何容器类型上执行搜索的算法,并且特别适用于那些订购的容器。
答案 2 :(得分:4)
find
是O(n)。
std::set
支持O(log n)插入和查找,是一个不错的选择。
std::tr1::unordered_set
提供了类似的接口,但支持近恒定时间查找。如果您有TR1(或C ++ 0x)并且不需要按顺序枚举元素,那么它是最佳选择。
答案 3 :(得分:3)
你想要的是算法库中的find_first_of方法。 (或二元搜索,或沿着这些线的任何东西)
答案 4 :(得分:0)
如果你想使用C ++标准容器,由于它的设计,容器本身不一定有“包含”,但你总是可以使用find算法。
您应该根据数据集的特征和访问“工作量”来选择容器。
有关C ++标准库中容器和算法的良好参考,请检查http://www.cplusplus.com
如果看起来,您的数据是由您要为其关联的唯一项目组成的,那么地图容器可能会很好地为您提供服务。如果您关心的只是“会员资格”,那么设置是更好的选择。