C++ 数组任意两个项相等

c++ array any two terms are equal

本文关键字:数组 任意两 C++      更新时间:2023-10-16

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

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

不使用个案工作

遍历数组中的元素,将每个元素添加到unordered_set。

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

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

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,因为无需比较已比较的值或将元素与自身进行比较。

对于小数据集来说,天真的方法是简单地使用一个比较循环,其中每个元素都与它后面的所有其他元素进行比较 - 没有必要与元素处或之前进行比较,因为比较已经完成,或者您将项目与自身进行比较。

以下完整程序说明了此方法:

#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 duplicatesn";
}

对于较大的数据集,您可以转向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 duplicatesn";
}

使用模板可以对此进行实质性改进。这将允许它处理任何数据类型的数组(当然,假设它有相等运算符),而不必为每个数组编写专用值。其代码如下:

#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 duplicatesn";
}

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


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