您好我正在尝试检查在任何大小的数组中输入的任何值是否不同。我试图为此代码使用嵌套循环,但无法获得正确的if语句来检查数组中的每个值是否不同。我很感激任何帮助!
for (unsigned i = 0; i < size; i++)
for (unsigned k = i + 1; k < size; k++)
if (arr[i] == arr[k]){
return false;
}
return true;
好的,谢谢你们帮助你的建议!
答案 0 :(得分:5)
您可以先对arr
进行排序吗?
std::sort(std::begin(arr), std::end(arr));
auto pos = std::adjacent_find(std::begin(arr), std::end(arr));
if (pos != std::end(arr))
// we have a duplicate
答案 1 :(得分:2)
第一个for循环是错误的。有一个j
而不是i
for (unsigned i = 0; i < size; i++)
...
答案 2 :(得分:2)
这是一种方法..
//Implement an algorithm “Unique” to check if all elements of a given set of
//integers are distinct.
#include <iostream>
using namespace std;
int main()
{
int arr[10] = {10, 20, 50, 90, 30, 60, 35, 40, 85, 90};
int i, k, origVal = 0, newVal = 0;
for (i = 0; i < 10; i++)
{
origVal = arr[i];
for (k = i+1; k < 10; k++)
{
if (origVal == arr[k])
{
newVal = 1;
break;
}
}
if (newVal ){break;}
}
if (newVal == 1)
{
cout<<"The Array does not contain completely distinct values"<<endl;
}
else
{
cout<< "The Array is distinct"<<endl;
}
system("PAUSE");
return 0;
}
答案 3 :(得分:1)
您的代码中存在两个问题:
1. first loop should have j instead if i.
2. The second loop should start from i+1.
希望这有帮助。
答案 4 :(得分:1)
为什么不使用惯用的c ++结构?
if (std::equal(a1, a1 + sizeof a1 / sizeof *a1, a2))
其中a1和a2是你的两个数组。
我看到问题得到了纠正,我只用而不是i和j,这让我觉得它是两个阵列。我将把这个答案作为在C ++ 11之前的版本中使用std :: equal的参考。但对于C + 11,请参阅下面的Jens解决方案。为此,必须包含<algorithm>
和<iterator>
。
答案 5 :(得分:1)
std :: set仅包含唯一元素。
#include <iostream>
#include <set>
int main()
{
int a[] = { 1, 9, 4, 5, 8, 3, 1, 3, 5 };
int b[] = { 1, 9, 4, 5, 8, 3 };
std::set<int> sa(a, a + 9);
std::cout << std::boolalpha << (sa.size() == (sizeof(a)/sizeof(*a))); //all values not different
std::set<int> sb(b, b + 6);
std::cout << std::boolalpha << (sb.size() == (sizeof(b)/sizeof(*b))); //true, all values are different
}
答案 6 :(得分:1)
更快更好的方法是使用地图。例如
std::map<int, int> m;
for (int i = 0; i < size; ++i) {
if (m[i] > 0) return false;
m[i]++;
}
return true;
一个班轮看起来像这样
return std::unique(arr, arr + size) == (arr + size);
答案 7 :(得分:1)
std::sort( std::begin(arr), std::end(arr) );
auto u = std::unique( std::begin(arr), std::end(arr) );
bool containsDuplicate = u != std::end(arr);
答案 8 :(得分:1)
如果您的序列已排序并且您想要删除重复项,或者您可以负担得起它或它的副本,然后删除重复项,那么您可以使用std :: unique标准库算法
在http://en.cppreference.com/w/cpp/algorithm/unique上有很好的例子,但是你需要记住的是,如果你将没有重复的排序序列传递给std :: unique,它会将迭代器返回到最后一个元素 - 通常端()。
如果它返回任何其他内容,则从返回的迭代器开始重复,这意味着在排序的非重复序列之后它们被移动到。然后你可以删除那些,例如用你执行的std :: vector v.erase(returnedIterator,v.end())。
答案 9 :(得分:0)
#include<iostream>
#include<algorithm>
int main(){
int arr[] = {3, 2, 3, 4, 1, 5, 5, 5};
int len = sizeof(arr) / sizeof(*arr); // Finding length of array
std::sort(arr, arr+len);
int unique_elements = std::unique(arr, arr+len) - arr; // Finding number of unique elements
if(unique_elements == 1) std:: cout << "All elements of this array are Equal\n";
else std::cout << "All elements of this array are not Equal\n";
return 0;
}