在数组中,如何检查两个变量是否相等
total_milk[7] = { b_milk, e_milk, d_milk, g_milk, a_milk, m_milk, h_milk };
不使用个案
答案 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
循环计数器j
从i + 1
开始,而不是0
或i
,因为无需比较已比较的值或将元素与本身。
答案 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
(如果没有重复项)或其中一个重复项的地址。检查返回值并采取适当措施很简单。
我怀疑可以进一步改进 以处理其他集合类型(不仅仅是裸数组),但是当您掌握了更简单的模板时,我将把它留作练习:-)>