【发布时间】:2011-05-31 23:47:08
【问题描述】:
我想用我插入整数的结构,然后可以问
if (container.contains(3)) { /**/ }
一定有这样的东西。
【问题讨论】:
标签: c++ insert integer containers contains
我想用我插入整数的结构,然后可以问
if (container.contains(3)) { /**/ }
一定有这样的东西。
【问题讨论】:
标签: c++ insert integer containers contains
您可以使用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)) { /*...*/ }
【讨论】:
std::set 只是为了保存线性时间搜索意味着其他设计后果,我认为这是过早的优化(实际上搜索甚至不会处于性能瓶颈中)。过早的优化是万恶之源。 IMO,对问题的不同解决方案不值得投反对票。
简单算法:
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();
}
通过这种方式,您可以获得对任何容器类型执行搜索的单一算法,并且在特殊情况下可以在订购的容器上更快。
【讨论】:
find 在未排序的向量上是 O(n)。
std::set 支持 O(log n) 插入和查找,是一个不错的选择。
std::tr1::unordered_set 提供了类似的接口,但支持近乎恒定的时间查找。如果你有 TR1(或 C++0x)并且不需要按顺序枚举元素,这是最好的选择。
【讨论】:
您想要的是算法库中的 find_first_of 方法。 (或二进制搜索,或任何类似的东西)
【讨论】:
如果你想使用 C++ 标准容器,由于它的设计,容器本身不一定有“包含”,但你总是可以使用 find 算法。
你应该根据你的数据集的特点和访问“工作量”来选择你的容器。
有关 C++ 标准库中的容器和算法的良好参考,请查看 http://www.cplusplus.com
如果您的数据看起来是由独特的项目组成的,并且您希望为其关联一个值,那么地图容器可能会为您提供很好的服务。如果你只关心“会员”,那么 set 是更好的选择。
【讨论】: