ChatGPT解决这个技术问题 Extra ChatGPT

检查 std::vector 是否包含某个对象? [复制]

这个问题在这里已经有了答案:如何找出一个项目是否存在于 std::vector 中? (18 个回答) 2 年前关闭。

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

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

return false;

这只能通过 std::map 来完成,因为它使用键?

谢谢

如果它包含特定的东西,或者只是它不是空的?
您使用的是哪个 C++ 参考?并且标头称为 <algorithm> - 注意没有 .h。
特定的东西,例如自定义结构。
如果容器包含自定义结构,那么您需要实现 operator== 来比较它们;然后 std::find 将起作用。
就像在 duplicate 中回答的一样,我认为最优雅的是使用 boost::algorithm::any_of_equal

E
E-rich

检查 v 是否包含元素 x

#include <algorithm>

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

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

if(!v.empty()){
    /* v is non-empty */
} else {
    /* v is empty */
}

如果 x 是 v 中的最后一个元素怎么办?
大卫,end() 指向最后一个元素之后的一个元素,所以一切正常。
在尝试确定向量中是否包含双精度数时,这是否考虑了数值公差?
@NicholasHamilton:不,它使用 operator==。如果您需要考虑数值容差,请使用 std::find_if 并提供合适的谓词。
@DarnocEloc:不。
B
Bertrand Martel

如果搜索元素很重要,我建议使用 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()... 之类的任何操作。


伟大的!!!我正在写一个词法分析器。集合将比向量好得多。 set 是否有类似 mapcount 方法?我还希望能够获取集合中元素的索引。
优秀的信息!感谢您回答直接问题并提供额外的解决方案。
这是个坏建议。如果性能很重要,请配置文件。无法保证复杂性分析对您的具体问题有任何意义。
这取决于元素的数量。 std::set 的查找特性非常适合以数据局部性为代价的具有大量元素的容器。您必须执行性能分析(例如分析)来决定多高足以从矢量数据结构切换到集合数据结构。
@Segmentation O(n) 表示法不是关于最坏的情况。 AFAIK,set 根本不像 vector。大多数 set 实现使用红黑树,这具有很大的开销。我不知道标题增加开销是什么意思。开销通常是指运行时开销。 set 的最佳用例是“我感觉很懒,不想考虑它”和“我需要尽快完成这件事”。如果您关心性能,则需要进行概要分析。 unordered_set 可能值得一试。
C
Community

见问题:How to find an item in a std::vector?

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


我通常不会为我的班级实现自定义 operator==() 以便能够使用 std::find() 一次或两次。如果将覆盖添加到类的公共接口中确实有意义,我只会这样做。需要能够使用 std::find() 并不能证明这一点。此外,如果您需要执行 std::find() 两次但需要以不同的方式比较您的对象怎么办?就像在不同的财产上?
如果您担心实现 operator==,那么我建议您使用 std::find_if,那么您可以为您的不同条件案例提供可重复使用的谓词