c ++数组任何两个术语都是相同的

时间:2018-01-03 20:02:39

标签: c++ arrays

在数组中,如何检查两个变量是否相等

total_milk[7] = { b_milk, e_milk, d_milk, g_milk, a_milk, m_milk, h_milk };

不使用个案

3 个答案:

答案 0 :(得分:5)

迭代数组中的元素,将每个元素添加到unordered_set。

unordered_set::insert()的返回值将告诉您该元素是否已在集合中。

答案 1 :(得分:3)

使用两个for loops并将每个元素与其他元素进行比较:

bool anyTwo(total_milk a[], std::size_t n) {
    for (std::size_t i = 0; i < n - 1; i++) {
        for (std::size_t j = i + 1; j < n; j++) {
            if (a[i] == a[j]) {
                return true;
            }
        }
    }
    return false;
}

这假设您的课程中==运算符过载了。第二个for循环计数器ji + 1开始,而不是0i,因为无需比较已比较的值或将元素与本身。

答案 2 :(得分:0)

幼稚的方法(适用于小型数据集)只是使用比较循环,其中将每个元素与其后的每个其他元素进行比较-与元素之前或之后的元素进行比较没有意义,因为比较已经完成,否则您将与自己进行比较。

下面的完整程序说明了这种方法:

#include <iostream>

int milk[] = { 3, 1, 4, 1, 5, 9 };
int main() {
    for (size_t one = 0; one < sizeof(milk) / sizeof(*milk) - 1; ++one) {
        for (size_t two = first + 1; two < sizeof(milk) / sizeof(*milk); ++two) {
            if (milk[one] == milk[two]) {
                std::cout << "Duplicate item: " << milk[one] << '\n';
                return 1;
            }
        }
    }
    std::cout << "No duplicates\n";
}

对于较大的数据集,您可以使用C ++库提供的更优化的集合,例如集合。一个集合能够保存每个值的一个,并具有有用的属性,即通过将两个迭代器都返回到插入的/原始的项目中,它将返回您尝试插入重复项的事实。和一个布尔值,指示它是新的还是重复的。

与先前的程序一样,该程序显示了如何使用此方法:

#include <iostream>
#include <unordered_set>

int milk[] = { 3, 1, 4, 1, 5, 9 };
int main() {
    std::unordered_set<int> checkSet;
    for (auto val: milk) {
        auto iterAndBool = checkSet.insert(val);
        if (! iterAndBool.second) {
            std::cout << "Duplicate item: " << val << '\n';
            return 1;
        }
    }
    std::cout << "No duplicates\n";
}

使用模板可以对其进行重大改进。这将允许它处理 any 数据类型的数组(当然,假设它具有相等运算符),而不必为每种类型编写专门的代码。相应的代码如下:

#include <iostream>
#include <unordered_set>

template<class T> T *CheckDupes(T *collection, size_t count) {
    std::unordered_set<T> checkSet;
    for (size_t idx = 0; idx < count; ++idx) {
        auto iterAndBool = checkSet.insert(collection[idx]);
        if (! iterAndBool.second) {
            return &(collection[idx]);
        }
    }
    return nullptr;
}

int milk[] = { 3, 1, 4, 1, 5, 9 };
int main() {
    int *dupe;
    if ((dupe = CheckDupes<int>(milk, sizeof(milk) / sizeof(*milk))) != nullptr) {
        std::cout << "Duplicate item: " << *dupe << '\n';
        return 1;
    }
    std::cout << "No duplicates\n";
}

上面的模板化函数将返回nullptr(如果没有重复项)或其中一个重复项的地址。检查返回值并采取适当措施很简单。


我怀疑可以进一步改进 以处理其他集合类型(不仅仅是裸数组),但是当您掌握了更简单的模板时,我将把它留作练习:-)