C++ 数组任意两个项相等
c++ array any two terms are equal
在数组中,如何检查任何两个变量是否相等,例如
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
循环计数器j
从i + 1
开始,而不是0
或i
,因为无需比较已比较的值或将元素与自身进行比较。
对于小数据集来说,天真的方法是简单地使用一个比较循环,其中每个元素都与它后面的所有其他元素进行比较 - 没有必要与元素处或之前进行比较,因为比较已经完成,或者您将项目与自身进行比较。
以下完整程序说明了此方法:
#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
(如果没有重复项)或其中一个重复项的地址。 检查返回值并采取适当行动很简单。
我怀疑可以进一步改进来处理其他集合类型(不仅仅是裸数组),但当您掌握了更简单的模板时,我会将其作为练习:-)
相关文章:
- 如何在C++中比较两个char数组
- 在c++中获取两个大int,并将它们存储在数组中
- 当数组位于两个循环之间时,您可以调用数组的 void 函数吗?
- 子数组中两个数字的相同出现(连续)
- 数组中两个元素的最大异或
- 我无法将二维数组的两个元素的差异分配给C++中其他数组的元素?
- 一个数组可以划分的最大子数组,使得不同子数组中任意两个元素的 GCD 始终为 1?
- 代码是否交换数组的两个数字
- C++ 数组任意两个项相等
- 由 8 个或更多位置分隔的数组中两个元素的最大乘积
- 为什么我的程序是,数组中任意两个元素之间的最小差异,给出相反的结果
- 为什么我可以声明一个二维数组与两个维度大小的变量,但不是新的
- 我需要连接一个unsigned char数组的两个元素并保持它为unsigned char
- 创建二维数组的两种方法的区别
- 找出后缀数组的两种算法中哪一种更快,为什么?
- 谁能帮我解决以下编译错误 - 关于数组的两个实现
- 为什么 std::vector 的速度是原始数组的两倍?包含完整的代码
- c++对象正在创建同一数组的两个实例,但作用域不同
- 最大化数组中两个元素及其索引的和
- 如何使用数组进行两次循环移位