分析我的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算法?如果没有,有什么建议可以提高效率吗?
我想确定向量中是否存在重复项。这里最好的选择是什么?
sort(arrLinkToClients.begin(), arrLinkToClients.end(), [&](const type1& lhs,const type1& rhs)
{
lhs.nTypeOfLink < rhs.nTypeOfLink;
});
auto it = unique(arrLinkToClients.begin(), arrLinkToClients.end(), [&](const type1& lhs, const type1& rhs)
{
lhs.nTypeOfLink == rhs.nTypeOfLink;
});
//how to check the iterator if there are duplicates ?
if (it)
{
//
}
Run Code Online (Sandbox Code Playgroud) 我希望这个布尔函数在数组包含任何重复元素时返回 true,如果不包含任何重复元素则返回 false。我的代码是:-
bool containsDuplicate(vector<int>& nums) {
int flag=0;
for(int i=0;i<nums.size()/2;i++)
{
for(int j=1;j<nums.size();j++)
{
if(nums[i]==nums[j])
{
flag=1;
}
}
}
if(flag==1)
return true;
else
return false;
}
Run Code Online (Sandbox Code Playgroud)
它适用于包含重复项的数组,但在数组具有唯一元素的情况下不会返回 false。