check if a std::vector contains a certain object?
Possible Duplicate:
How to find an item in a std::vector?
中是否有允许您检查std::container是否包含某些内容的东西?或者,一种制作方法,例如:
1 2 3 4
| if(a.x == b.x && a.y == b.y)
return true;
return false; |
这只能用std::map来完成吗,因为它使用密钥?
谢谢
- 性病:发现……
- 如果它包含某个特定的东西,或者只是其中一个不为空?
- 你使用的C++引用是什么?头称为—注h。
- 特定的东西,如自定义结构。
- 如果容器包含自定义结构,则需要实现operator==来比较它们;然后std::find将工作。
- 就像副本中的答案一样,我认为最优雅的是使用boost::algorithm::any_of_equal。
检查v是否包含元素x:
1 2 3 4 5 6 7
| #include
if(std::find(v.begin(), v.end(), x) != v.end()) {
/* v contains x */
} else {
/* v does not contain x */
} |
检查EDOCX1[1]是否包含元素(非空):
1 2 3 4 5
| if(!v.empty()){
/* v is non-empty */
} else {
/* v is empty */
} |
- 如果x是v的最后一个元素怎么办?
- david,end()指向最后一个元素的前面一个元素,所以一切都可以解决。
- 当试图确定向量中是否有双精度数时,这是否解释了数值公差?
- @尼可拉沙米尔顿:不,它用的是operator==。如果需要考虑数字公差,请使用std::find_if并提供适当的谓词。
如果搜索元素很重要,我建议使用std::set而不是std::vector。使用此:
std::find(vec.begin(), vec.end(), x)在O(n)时间内运行,但std::set有自己的find()成员(即myset.find(x)在O(logn)时间内运行,这对大量元素来说效率更高。
std::set还保证了所有添加的元素都是唯一的,这样您就不必做任何类似if not contained then push_back()...的事情。
- 伟大的!!!!我在写一部莱克斯。集合比向量要好得多。set是否有类似map的count方法?我还希望能够获取集合中元素的索引。
- 非常好的信息!感谢您回答直接问题并提供其他解决方案。
- 这是个坏建议。如果性能很重要,请概述。对于您的具体问题,复杂性分析没有任何的保证。
- 这取决于元素的数量。std::set的查找特性对于具有大量元素且以数据位置为代价的控件非常有用。您必须执行性能分析(如分析),以确定从矢量数据结构切换到集合数据结构的高度。
- @Andreashaferburg我是一个完整的分析和性能的新手,但是如果一个set在最坏的情况下像一个vector一样工作,那么使用并不是更好,只是为了避免包括,Afaik只会为使用find()而增加太多的开销。我说的是未分类的数据。
- 分割O(n)符号不是最坏的情况。AFEK,EDCOX1的6度不能像EDOCX1×10那样工作。大多数EDOCX1 6实现使用红黑树,其具有显著的开销。我不知道头加开销是什么意思。开销通常指运行时开销。EDOCX1 6的最佳用例是"我感觉懒惰,不想考虑它"和"我需要尽快完成这件事"。如果你关心性能,你需要进行配置。unordered_set可能值得一试。
- @安德烈亚萨弗伯格也许"管理费"这个词不是正确的选择。包括,一个只使用find()的"重"头,因为一个项目越大,可能会影响编译时间等。我知道我可能会偏离主题。
- 注意std::sets和std::vectors上所有其他操作的复杂性。附加到向量的是o(1)(如果不是重新分配)。插入到集合中是o(log n)。插入std::unordered_set是o(1),永远不会重新分配。SUCHS的超视距是为什么仿形很重要的重要原因之一!
- 对于编译时间,同样的事情也适用。当这真的成为一个问题时,就要知道有很多事情你可以优化。诸如多核编译、正确使用正向声明、适当的软件设计以减少编译依赖性、预编译头,以及有时(如果适用)在cpp文件中使用显式模板实例化等。我喜欢在每个项目中总是创建一个fwd_decl.hpp文件,其中包含所有类、结构等的所有前向声明,并且它们只是将它们包含在所有其他头文件中,而不需要再考虑。
请参见问题:如何在std::vector中查找项?
如果默认的一个不足以进行"深度"相等性测试,则还需要确保为对象实现了一个合适的EDCOX1 0。
- 我通常不会为我的类实现一个自定义的operator==(),以便只使用std::find()一次或两次。只有在将该重写添加到类的公共接口中才有意义时,我才会这样做。需要能够使用std::find()并不能证明这一点。此外,如果您需要执行两次std::find(),但需要以不同的方式比较对象,该怎么办?就像在另一个地方?