【发布时间】:2013-12-15 17:29:52
【问题描述】:
如果我有一个值向量并想检查它们是否都相同,那么在 C++ 中有效地执行此操作的最佳方法是什么?如果我用 R 之类的其他语言编程,我想到的一种方法是只返回容器的唯一元素,然后如果唯一元素的长度大于 1,我知道所有元素不可能相同。在 C++ 中,可以这样完成:
//build an int vector
std::sort(myvector.begin(), myvector.end());
std::vector<int>::iterator it;
//Use unique algorithm to get the unique values.
it = std::unique(myvector.begin(), myvector.end());
positions.resize(std::distance(myvector.begin(),it));
if (myvector.size() > 1) {
std::cout << "All elements are not the same!" << std::endl;
}
但是在互联网上阅读时,我看到了其他答案,例如使用 set 或 find_if 算法。那么最有效的方法是什么,为什么?我想我的方法不是最好的,因为它涉及对每个元素进行排序,然后调整向量的大小 - 但也许我错了。
【问题讨论】:
-
之前有人问过这个问题:stackoverflow.com/questions/15531258/… 那里的答案指出,重要的是,O(n) compare-all-to-the-first 方法的效率可以通过确保你获得一旦找到第一个不相等的元素,就中断循环。
-
数组版本:stackoverflow.com/questions/14120346/… 是
data()的子集。 -
空向量的首选行为是什么? std::equal 和 std::adjacent_find 答案返回 false,std::find_if 和 std::all_of 返回 true。
标签: c++ algorithm vector comparison unique