C ++如何检查数组中的所有值是否不同?

时间:2015-09-04 06:28:46

标签: c++ loops nested-loops

您好我正在尝试检查在任何大小的数组中输入的任何值是否不同。我试图为此代码使用嵌套循环,但无法获得正确的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;

好的,谢谢你们帮助你的建议!

10 个答案:

答案 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;
}