分析我的cpu绑定代码表明我花了很长时间检查容器是否包含完全唯一的元素.假设我有一些未分类元素的大容器(有<和=定义),我有两个关于如何做到这一点的想法:
第一个使用一组:
template <class T>
bool is_unique(vector<T> X) {
set<T> Y(X.begin(), X.end());
return X.size() == Y.size();
}
Run Code Online (Sandbox Code Playgroud)
第二个循环元素:
template <class T>
bool is_unique2(vector<T> X) {
typename vector<T>::iterator i,j;
for(i=X.begin();i!=X.end();++i) {
for(j=i+1;j!=X.end();++j) {
if(*i == *j) return 0;
}
}
return 1;
}
Run Code Online (Sandbox Code Playgroud)
我已经尽我所能测试了它们,而且从阅读有关STL的文档中我可以收集到的,答案是(像往常一样),这取决于.我认为在第一种情况下,如果所有元素都是唯一的,那么它非常快,但如果存在大的简并性,则操作似乎需要O(N ^ 2)时间.对于嵌套迭代器方法,相反似乎是正确的,X[0]==X[1]如果所有元素都是唯一的,则可以快速点亮,但是(如果可以理解)O(N ^ 2)时间.
有没有更好的方法来做到这一点,也许是为此目的而构建的STL算法?如果没有,有什么建议可以提高效率吗?
可能重复:
确定无序向量<T>是否具有所有唯一元素
我必须检查一个矢量的重复.解决这个问题的最佳方法是什么:
我拿第一个元素,将它与向量中的所有其他元素进行比较.然后采取下一个元素并执行相同的操作,依此类推.
这是最好的方法,还是有更有效的方法来检查重复?
我想检查一个整数向量是否有任何重复,如果有,则必须返回true.所以我尝试做这样的事情:
vector<int> uGuess = {1,2,3,3,4,5}
vector<int> a = uGuess;
sort(a.begin(), a.end());
bool d = unique(a.begin(), a.end());
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为unqiue不能被指定为bool值.我该怎么办呢?如果我要写一个for循环来执行相同的操作,我该怎么做?