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

Tim*_*Tim 13 c++ containers integer contains insert

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

if (container.contains(3)) { /**/ }
Run Code Online (Sandbox Code Playgroud)

必须有类似的东西.

Jes*_*ond 15

你可以用std::vector.

std::vector<int> myVec;
myVec.push_back(3);
if (std::find(myVec.begin(), myVec.end(), 3) != myVec.end())
{
    // do your stuff
}
Run Code Online (Sandbox Code Playgroud)

你甚至可以做一个小帮手功能:

template <class T>
bool contains(const std::vector<T> &vec, const T &value)
{
    return std::find(vec.begin(), vec.end(), value) != vec.end();
}
Run Code Online (Sandbox Code Playgroud)

以下是如何使用它:

if (contains(myVec, 3)) { /*...*/ }
Run Code Online (Sandbox Code Playgroud)

  • @Nemo:OP从未要求快速执行方法,但只针对一种工作方法.我提出了一般问题的一般解决方案.如果OP要求速度很重要的特定问题,那么另一种解决方案会更好.为了节省线性时间搜索,立即选择`std :: set`意味着其他设计后果,我认为这是过早的优化(实际上搜索甚至不会出现在性能瓶颈中).过早优化是万恶之源.对于问题的不同解决方案不值得投票,IMO. (12认同)
  • @Nemo:正确的线性时间解决方案很好,除非测量证明它是一个重要的瓶颈. (11认同)
  • 如果由于某种原因无法使用排序列表或哈希表,则线性时间是最佳选择(例如,您希望保留插入顺序.) (3认同)

Mat*_* M. 9

简单的算法:

template <typename Container>
bool contains(Container const& c, typename Container::const_reference v) {
  return std::find(c.begin(), c.end(), v) != c.end();
}
Run Code Online (Sandbox Code Playgroud)

您可以对其进行自定义,以便更有效地搜索某些已知容器:

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();
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以获得一个对任何容器类型执行搜索的算法,并且特别可以在订购的容器上加快速度.


Nem*_*emo 5

find未排序向量的复杂度为 O(n)。

std::set支持 O(log n) 插入和查找,是一个不错的选择。

std::tr1::unordered_set提供类似的界面,但支持近乎恒定时间的查找。如果您有 TR1(或 C++0x)并且不需要按顺序枚举元素,那么它是最佳选择。

  • 对于较小的 n,未排序的向量完全没问题,甚至可能更快。 (2认同)