在C++中使用元组的无序集合及示例
什么是元组?
在C++中,元组是用于将元素分组的对象。在元组中,元素可以是相同的数据类型或不同的数据类型。元组的元素按它们被访问的顺序进行初始化。
与元组相关的函数:
1. make_tuple(): make_tuple()用于给元组赋值。传递的值应按照在元组中声明的值的顺序进行。
2. get(): get()用于访问元组值并修改它们,它接受索引和元组名称作为参数来访问特定的元组元素。
什么是无序集合?
无序集合是一种无序的关联容器,类似于集合,但在无序集合的情况下,元素不按任何特定顺序排列。像集合一样,无序集合也包含唯一的元素。无序集合在内部使用哈希表实现,键被哈希到哈希表的索引中。在无序集合中插入元素始终是不可预测或随机的。无序集合中的大多数操作都需要常量时间O(1),但在最坏的情况下,时间复杂度可能会达到O(n)。
与无序集合相关的函数:
- insert(x) :将新元素“x”插入无序集合容器中。
- begin() :返回指向无序集合容器中第一个元素的迭代器。
- end() :返回指向虚拟在最后一个元素后面的元素的迭代器。
- count() :计算无序集合容器中特定元素出现的次数。
- erase() :删除单个元素或从开始到结束(排除)的一系列元素。
- size() :返回无序集合容器中的元素数量。
- swap() :交换两个无序集合容器的值。
- max_size() :返回无序集合容器可以容纳的最大元素数量。
- empty() :检查无序集合容器是否为空。
一个元组的无序集合可以在算法需要复杂数据结构的情况下非常有用。
本文重点介绍如何在C++中创建一个元组的无序集合。注意,为简单起见,我们考虑了一个包含三个元素的元组,但一个元组也可以包含更多或更少的元素。
元组的无序集合
一个元组的无序集合是一个无序集合,其中每个元素都是一个元组。请注意,默认情况下,无序集合没有元组的功能。简单来说,在C++中不能直接声明一个元组的无序集合。必须将哈希函数作为参数传递给无序集合。
语法:
**unordered_set <tuple<数据类型1,数据类型2,数据类型3>,哈希函数> unorderedSetOfTuples; **
在这里,
数据类型1、数据类型2、数据类型3 是相似或不相似的数据类型
哈希函数:
struct hashFunction
{
size_t operator()(const tuple<int , int , int>&x) const
{
return get<0>(x) ^ get<1>(x) ^ get<2>(x);
}
};
示例1: 下面是使用元组的无序集合的实现。
// C++程序,演示unorderedSet的tuple实现
#include <bits/stdc++.h>
using namespace std;
// 哈希函数
struct hashFunction
{
size_t operator()(const tuple<int , int , int>&x) const
{
return get<0>(x) ^ get<1>(x) ^ get<2>(x);
}
};
// 打印unordered set元素的函数
void print(unordered_set<tuple<int, int, int>, hashFunction > &unorderedSetOfTuples)
{
// 遍历unorderedSetOfTuples的元素
for (auto currentTuple : unorderedSetOfTuples)
{
// 每个元素本身就是一个tuple
tuple<int, int, int> tp = currentTuple;
cout << "[ ";
// 打印tuple的元素
cout << get<0>(tp) << " , "
<< get<1>(tp) << " , "
<< get<2>(tp) ;
cout << " ]";
cout << "\n";
}
}
// 主函数
int main()
{
// 声明一个unordered set的tuple
unordered_set<tuple<int, int, int>, hashFunction > unorderedSetOfTuples;
// 初始化int类型的tuple
tuple<int, int, int> tuple1;
tuple1 = make_tuple(4, 2, 3);
tuple<int, int, int> tuple2;
tuple2 = make_tuple(2, 3, 5);
tuple<int, int, int> tuple3;
tuple3 = make_tuple(2, 3, 5);
tuple<int, int, int> tuple4;
tuple4 = make_tuple(2, 1, 4);
tuple<int, int, int> tuple5;
tuple5 = make_tuple(4, 2, 3);
// 插入到unordered set中
unorderedSetOfTuples.insert(tuple1);
unorderedSetOfTuples.insert(tuple2);
unorderedSetOfTuples.insert(tuple3);
unorderedSetOfTuples.insert(tuple4);
unorderedSetOfTuples.insert(tuple5);
// 调用打印函数
print(unorderedSetOfTuples);
return 0;
}
输出:
[ 2 , 1 , 4 ]
[ 4 , 2 , 3 ]
[ 2 , 3 , 5 ]
解释:
上述输出中,元素或tuple没有以任何特定顺序排列。
示例2: 下面是使用tuple的unordered set的实现。
// C++程序,演示实现无序元组集合
#include <bits/stdc++.h>
using namespace std;
// 哈希函数
struct hashFunction
{
size_t operator()(const tuple<bool,
bool, bool>&x) const
{
return get<0>(x) ^ std::get<1>(x) ^ std::get<2>(x);
}
};
// 打印unorderedSet的元素
void print(unordered_set<tuple<bool, bool,
bool>, hashFunction > &unorderedSetOfTuples)
{
// 遍历unorderedSetOfTuples的元素
for (auto currentTuple : unorderedSetOfTuples)
{
// 每个元素本身也是一个tuple,其元素均为bool类型
tuple<bool, bool, bool> tp = currentTuple;
cout << "[ ";
// 打印tuple元素
cout << get<0>(tp) <<
" , " << get<1>(tp) <<
" , " << get<2>(tp) ;
cout << " ]";
cout << "\n";
}
}
// 主函数
int main()
{
// 声明一个无序集合unorderedSetOfTuples
unordered_set<tuple<bool, bool,
bool>, hashFunction > unorderedSetOfTuples;
// 初始化bool类型的tuple
tuple<bool, bool,
bool> tuple1;
tuple1 = make_tuple(0, 1, 1);
tuple<bool, bool,
bool> tuple2;
tuple2 = make_tuple(1, 1, 1);
tuple<bool, bool,
bool> tuple3;
tuple3 = make_tuple(0, 1, 1);
tuple<bool, bool,
bool> tuple4;
tuple4 = make_tuple(0, 0, 0);
tuple<bool, bool,
bool> tuple5;
tuple5 = make_tuple(1, 1, 0);
tuple<bool, bool,
bool> tuple6;
tuple6 = make_tuple(0, 1, 1);
// 插入unordered set
unorderedSetOfTuples.insert(tuple1);
unorderedSetOfTuples.insert(tuple2);
unorderedSetOfTuples.insert(tuple3);
unorderedSetOfTuples.insert(tuple4);
unorderedSetOfTuples.insert(tuple5);
unorderedSetOfTuples.insert(tuple6);
// 调用print函数
print(unorderedSetOfTuples);
return 0;
}
输出:
[ 1 , 1 , 0 ]
[ 0 , 0 , 0 ]
[ 0 , 1 , 1 ]
[ 1 , 1 , 1 ]
解释:
在上面的输出中,元素没有按照任何特定的顺序排列。这证实了在无序集合中,键以随机方式哈希到哈希表的索引中。另外,tuple3和tuple6具有相同的布尔值集,因此集合中只有一个tuple副本。