这个问题在这里已经有了答案:如何找出一个项目是否存在于 std::vector 中? (18 个回答) 2 年前关闭。
<algorithm>
中有什么东西可以让您检查 std:: 容器是否包含某些东西?或者,一种制作方法,例如:
if(a.x == b.x && a.y == b.y)
return true;
return false;
这只能通过 std::map
来完成,因为它使用键?
谢谢
<algorithm>
- 注意没有 .h。
operator==
来比较它们;然后 std::find
将起作用。
boost::algorithm::any_of_equal
。
检查 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 */
}
如果搜索元素很重要,我建议使用 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
是否有类似 map
的 count
方法?我还希望能够获取集合中元素的索引。
set
根本不像 vector
。大多数 set
实现使用红黑树,这具有很大的开销。我不知道标题增加开销是什么意思。开销通常是指运行时开销。 set
的最佳用例是“我感觉很懒,不想考虑它”和“我需要尽快完成这件事”。如果您关心性能,则需要进行概要分析。 unordered_set
可能值得一试。
见问题:How to find an item in a std::vector?
如果默认值不足以进行“深度”相等性测试,您还需要确保为您的对象实现了合适的 operator==()
。
operator==()
以便能够使用 std::find()
一次或两次。如果将覆盖添加到类的公共接口中确实有意义,我只会这样做。需要能够使用 std::find()
并不能证明这一点。此外,如果您需要执行 std::find()
两次但需要以不同的方式比较您的对象怎么办?就像在不同的财产上?
operator==
,那么我建议您使用 std::find_if
,那么您可以为您的不同条件案例提供可重复使用的谓词
operator==
。如果您需要考虑数值容差,请使用std::find_if
并提供合适的谓词。