检查std :: vector是否包含某个对象?

jma*_*erx 245 c++ vector

可能重复:
如何在std :: vector中查找项目?

有什么东西<algorithm>可以让你检查std :: container是否包含某些内容?或者,制作一个方法,例如:

if(a.x == b.x && a.y == b.y)
return true;

return false;
Run Code Online (Sandbox Code Playgroud)

这可以只std::map使用密钥吗?

谢谢

You*_*You 485

检查是否v包含元素x:

#include <algorithm>

if(std::find(v.begin(), v.end(), x) != v.end()) {
    /* v contains x */
} else {
    /* v does not contain x */
}
Run Code Online (Sandbox Code Playgroud)

检查是否v包含元素(非空):

if(!v.empty()){
    /* v is non-empty */
} else {
    /* v is empty */
}
Run Code Online (Sandbox Code Playgroud)

  • 大卫,end()指向最后一个元素的一个,所以一切都解决了. (79认同)
  • 如果x是v中的最后一个元素怎么办? (20认同)
  • @NicholasHamilton:不,它使用`operator ==`.如果需要考虑数值公差,请使用[`std :: find_if`](http://en.cppreference.com/w/cpp/algorithm/find)并提供合适的谓词. (14认同)
  • 在尝试确定双精度是否在向量中时,这是否考虑了数值公差? (3认同)

Ash*_*ain 94

如果搜索元素很重要,我建议std::set不要使用std::vector.使用这个:

std::find(vec.begin(), vec.end(), x)在O(n)时间运行,但std::set有自己的find()成员(即.myset.find(x))在O(log n)时间运行 - 这对于大量元素来说效率更高

std::set还保证所有添加的元素都是独一无二的,这使您不必再做任何事情if not contained then push_back()....

  • 这是一个糟糕的建议.如果表现很重要,请说明.无论如何,复杂性分析无法保证您的具体问题. (9认同)
  • 极好的信息!感谢您回答直接问题并提供其他解决方案。 (3认同)
  • 这取决于元素的数量。std::set 的查找特性非常适合以数据局部性为代价的具有大量元素的容器。您必须执行性能分析(例如分析)来决定多高足以从向量数据结构切换到集合数据结构。 (2认同)
  • @Segmentation O(n) 表示法与最坏情况无关。AFAIK,`set` 根本不像`vector` 那样工作。大多数`set` 实现都使用红黑树,它们有很大的开销。我不知道你说的标题增加开销是什么意思。开销通常是指运行时开销。`set` 的最佳用例是“我感觉很懒,不想考虑它”和“我需要快速完成这件事”。如果您关心性能,则需要进行概要分析。`unordered_set` 可能值得一试。 (2认同)

Nei*_*ant 12

请参阅问题:如何在std :: vector中查找项目?

operator==()如果默认值不足以进行"深度"相等测试,您还需要确保已实现适合您的对象.