什么是带有“包含”操作的C ++容器?

时间:2011-05-31 23:47:08

标签: c++ insert integer containers contains

我想使用我插入整数的结构,然后可以询问

if (container.contains(3)) { /**/ }

必须有这样的东西。

5 个答案:

答案 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方法。 (或二元搜索,或沿着这些线的任何东西)

http://www.cplusplus.com/reference/algorithm/find_first_of/

答案 4 :(得分:0)

如果你想使用C ++标准容器,由于它的设计,容器本身不一定有“包含”,但你总是可以使用find算法。

您应该根据数据集的特征和访问“工作量”来选择容器。

有关C ++标准库中容器和算法的良好参考,请检查http://www.cplusplus.com

ContainersAlgorithms

如果看起来,您的数据是由您要为其关联的唯一项目组成的,那么地图容器可能会很好地为您提供服务。如果您关心的只是“会员资格”,那么设置是更好的选择。