带有示例的 C++ 中的无序元组集
什么是元组?
C++ 中的元组是用于将元素组合在一起的对象。在元组中,元素可以是相同的数据类型或不同的数据类型。元组的元素按照它们被访问的顺序进行初始化。
与元组关联的函数:
1、make_tuple(): make_tuple()用于给元组赋值。传递的值应该与元组中声明的值顺序一致。
2. get(): get() 用于访问元组值并对其进行修改,它接受索引和元组名称作为参数来访问特定的元组元素。
什么是无序集?
无序集是类似于集合的无序关联容器,但在无序集的情况下,元素不以任何特定顺序排列。像集合一样,无序集合也包含独特的元素。无序集在内部使用散列表实现,键被散列到散列表的索引中。无序集中的插入总是不可预测或随机的。无序集中的大多数操作都需要固定时间 O(1),但在最坏的情况下,时间复杂度可能会上升到 O(n)。
与无序集相关的函数:
- insert(x):在无序集合容器中插入一个新元素“x”。
- begin():返回一个指向 unordered_set 容器中第一个元素的迭代器。
- end():返回一个迭代器,指向紧邻结束元素的假设元素。
- count():计算特定元素出现在 unordered_set 容器中的次数。
- 擦除():删除单个元素或从开始到结束的一系列元素(不包括)。
- size():返回 unordered_set 容器中的元素个数。
- swap():交换两个 unordered_set 容器的值。
- max_size():返回 unordered_set 容器可以容纳的最大元素数。
- empty():检查 unordered_set 容器是否为空。
每当算法需要复杂的数据结构时,一组无序的元组就非常有用。
本文重点介绍如何在 C++ 中创建一组无序的元组。请注意,为简单起见,我们考虑了一个包含三个元素的元组,但一个元组也可以包含更多或更少的元素。
无序的元组集
元组的无序集是其中每个元素都是一个元组的无序集。请注意,默认情况下,无序集没有元组的功能。简单来说,不能直接在 C++ 中声明一组无序的元组。必须将哈希函数作为参数传递给无序集。
句法:
unordered_set
Here,
dataType1, dataType2, dataType3 are similar or dissimilar data types
hashFunction:
struct hashFunction
{
size_t operator()(const tuple
{
return get<0>(x) ^ get<1>(x) ^ get<2>(x);
}
};
示例 1:下面是使用一组无序元组的实现。
C++
// C++ program to illustrate the
// implementation of unorderedSet of
// tuples
#include
using namespace std;
// Hash function
struct hashFunction
{
size_t operator()(const tuple&x) const
{
return get<0>(x) ^ get<1>(x) ^ get<2>(x);
}
};
// Function to print unordered set elements
void print(unordered_set, hashFunction > &unorderedSetOfTuples)
{
// Iterating over unorderedSetOfTuples elements
for (auto currentTuple : unorderedSetOfTuples)
{
// Each element is a tuple itself
tuple tp = currentTuple;
cout << "[ ";
// Printing tuple elements
cout << get<0>(tp) <<
" , " << get<1>(tp) <<
" , " << get<2>(tp) ;
cout << " ]";
cout << "\n";
}
}
// Driver code
int main()
{
// Declaring a unordered set of tuples
unordered_set, hashFunction > unorderedSetOfTuples;
// Initializing tuples of int type
tuple tuple1;
tuple1 = make_tuple(4, 2, 3);
tuple tuple2;
tuple2 = make_tuple(2, 3, 5);
tuple tuple3;
tuple3 = make_tuple(2, 3, 5);
tuple tuple4;
tuple4 = make_tuple(2, 1, 4);
tuple tuple5;
tuple5 = make_tuple(4, 2, 3);
// Inserting into unordered set
unorderedSetOfTuples.insert(tuple1);
unorderedSetOfTuples.insert(tuple2);
unorderedSetOfTuples.insert(tuple3);
unorderedSetOfTuples.insert(tuple4);
unorderedSetOfTuples.insert(tuple5);
// Calling print function
print(unorderedSetOfTuples);
return 0;
}
C++
// C++ program to illustrate the
// implementation of unordered set of
// tuples
#include
using namespace std;
// Hash function
struct hashFunction
{
size_t operator()(const tuple&x) const
{
return get<0>(x) ^ std::get<1>(x) ^ std::get<2>(x);
}
};
// Function to print unorderedSet elements
void print(unordered_set, hashFunction > &unorderedSetOfTuples)
{
// Iterating over unorderedSetOfTuples elements
for (auto currentTuple : unorderedSetOfTuples)
{
// Each element is a tuple itself of
// bool type
tuple tp = currentTuple;
cout << "[ ";
// Printing tuple elements
cout << get<0>(tp) <<
" , " << get<1>(tp) <<
" , " << get<2>(tp) ;
cout << " ]";
cout << "\n";
}
}
// Driver code
int main()
{
// Declaring a unordered set of tuples
unordered_set, hashFunction > unorderedSetOfTuples;
// Initializing tuples of bool type
tuple tuple1;
tuple1 = make_tuple(0, 1, 1);
tuple tuple2;
tuple2 = make_tuple(1, 1, 1);
tuple tuple3;
tuple3 = make_tuple(0, 1, 1);
tuple tuple4;
tuple4 = make_tuple(0, 0, 0);
tuple tuple5;
tuple5 = make_tuple(1, 1, 0);
tuple tuple6;
tuple6 = make_tuple(0, 1, 1);
// Inserting into the unordered set
unorderedSetOfTuples.insert(tuple1);
unorderedSetOfTuples.insert(tuple2);
unorderedSetOfTuples.insert(tuple3);
unorderedSetOfTuples.insert(tuple4);
unorderedSetOfTuples.insert(tuple5);
unorderedSetOfTuples.insert(tuple6);
// Calling print function
print(unorderedSetOfTuples);
return 0;
}
输出:
[ 2 , 1 , 4 ]
[ 4 , 2 , 3 ]
[ 2 , 3 , 5 ]
解释:
在上述输出中,元素或元组没有按任何特定顺序排列。
示例 2:下面是使用一组无序元组的实现。
C++
// C++ program to illustrate the
// implementation of unordered set of
// tuples
#include
using namespace std;
// Hash function
struct hashFunction
{
size_t operator()(const tuple&x) const
{
return get<0>(x) ^ std::get<1>(x) ^ std::get<2>(x);
}
};
// Function to print unorderedSet elements
void print(unordered_set, hashFunction > &unorderedSetOfTuples)
{
// Iterating over unorderedSetOfTuples elements
for (auto currentTuple : unorderedSetOfTuples)
{
// Each element is a tuple itself of
// bool type
tuple tp = currentTuple;
cout << "[ ";
// Printing tuple elements
cout << get<0>(tp) <<
" , " << get<1>(tp) <<
" , " << get<2>(tp) ;
cout << " ]";
cout << "\n";
}
}
// Driver code
int main()
{
// Declaring a unordered set of tuples
unordered_set, hashFunction > unorderedSetOfTuples;
// Initializing tuples of bool type
tuple tuple1;
tuple1 = make_tuple(0, 1, 1);
tuple tuple2;
tuple2 = make_tuple(1, 1, 1);
tuple tuple3;
tuple3 = make_tuple(0, 1, 1);
tuple tuple4;
tuple4 = make_tuple(0, 0, 0);
tuple tuple5;
tuple5 = make_tuple(1, 1, 0);
tuple tuple6;
tuple6 = make_tuple(0, 1, 1);
// Inserting into the unordered set
unorderedSetOfTuples.insert(tuple1);
unorderedSetOfTuples.insert(tuple2);
unorderedSetOfTuples.insert(tuple3);
unorderedSetOfTuples.insert(tuple4);
unorderedSetOfTuples.insert(tuple5);
unorderedSetOfTuples.insert(tuple6);
// Calling print function
print(unorderedSetOfTuples);
return 0;
}
输出:
[ 1 , 1 , 0 ]
[ 0 , 0 , 0 ]
[ 0 , 1 , 1 ]
[ 1 , 1 , 1 ]
解释:
在上述输出中,元素也没有按任何特定顺序排列。这证实了在无序集合中,键以随机方式散列到散列表的索引中。此外,tuple3 和 tuple6 具有相同的布尔值集合,这就是为什么集合中只存在一个元组副本的原因。