在C++中使用示例的元组的Multiset
什么是元组?
在C++中,元组是将一组元素绑定在一起的对象。这些元素可以是相似的,也可以是不同的数据类型。元组的元素按访问顺序初始化。
语法:
**tuple <data_type1, data_type2, dataType3, ….> myTuple **
在这里,
dataType1,dataType2,dataType3……是类似的或不同的数据类型
与元组相关的函数:
1. make_tuple(): make_tuple()用于分配具有值的元组。传递的值应按tuple中声明的值的顺序排列。
语法:
myTuple = make_tuple(value1, value2, value3,….)
2. get(): get()用于访问元组值并修改它们,它接受索引和元组名称作为访问特定元组元素的参数。
语法:
get <index>(myTuple)
在这里,
index是我们要访问myTuple中的元素的索引。在元组中索引从零开始。
什么是multiset?
multiset是一种类似于set的关联容器类型,但在multiset的情况下,所有元素都必须成对不同。简单地说,可以有多个具有相同值的元素。
语法:
multiset <dataType> myMultiset;
在这里,
dataType是数据类型。
与multiset相关的函数:
- begin(): 返回multiset中的第一个元素的迭代器。
- end(): 返回multiset中最后一个元素之后的理论元素的迭代器。
- size(): 返回multiset中的元素数量。
- max_size(): 返回multiset可以容纳的最大元素数。
- empty(): 返回multiset是否为空。
元组的multiset在算法需要复杂数据结构时非常有用。本文介绍了如何在C++中创建元组的multiset。请注意,为简单起见,考虑了三个元素的元组,但元组也可以包含更多或更少的元素。
元组的multiset
元组的multiset是其中每个元素都是元组的multiset。
语法:
**multiset <tuple<dataType1, dataType2, dataType3>> multisetOfTuples; **
在这里,
dataType1,dataType2,dataType3是类似的或不同的数据类型。
示例1: 下面是实现元组的multiset的C++程序:
// C++程序演示了
//元组的多重实现
#include
using namespace std;
//打印多重集合的内容
void print(multiset<tuple<int, int,
int> >& multisetOfTuples)
{
//遍历multisetOfTuples元素
for(auto x : multisetOfTuples)
{
//每个元素本身也是元组
tuple<int, int, int>tp = x;
//打印元组的元素
cout<<get<0>(tp)<<
' '<<get<1>(tp)<<
' '<<get<2>(tp)<<'\n';
}
}
//主函数
int main()
{
//声明一个元组的多重集合
multiset<tuple<int, int,
int> > multisetOfTuples;
//初始化元组
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);
//插入到集合中
multisetOfTuples.insert(tuple1);
multisetOfTuples.insert(tuple2);
multisetOfTuples.insert(tuple3);
multisetOfTuples.insert(tuple4);
multisetOfTuples.insert(tuple5);
//调用print函数
print(multisetOfTuples);
return 0;
}
输出:
2 1 4
2 3 5
2 3 5
4 2 3
4 2 3
说明:
在上述输出中,多重集合中总共有五个元组,其中 (2, 3, 5) 和 (4, 2, 3) 重复出现两次。默认情况下,元组按非降序排列在多重集合中,并遵循以下逻辑:
- 在多重集合中,如果两个元组的第一个值相等,则比较元组的第二个值,如果它也相等,则比较第三个值。
- 但是,始终可以将比较器传递给集合。
示例2: 下面是一个C++程序,演示将比较器传递给多重集合,以按非升序排列多重集合元素。
// C++程序演示
//使用自定义比较器实现
//元组的多重集合
#include <bits/stdc++.h>
using namespace std;
//多重集合元素的比较器
//按非升序排列我们可以
//按需求修改比较器
struct cmp
{
//将多重集合元素排列为非升序
bool operator()(const tuple<int, int,
int>& x,
const tuple<int, int,
int>& y)
{
//如果相应元组的第一个元素相等
if (get<0>(x) == get<0>(y))
{
//如果相应元组的第二个元素相等
if (get<1>(x) == get<1>(y))
return get<2>(x) > get<2>(y);
return get<1>(x) > get<1>(y);
}
return get<0>(x) > get<0>(y);
}
};
//打印多重集合元素的函数
void print(multiset<tuple<int, int,
int>, cmp>& multisetOfTuples)
{
for (auto x : multisetOfTuples)
{
//多重集合中的每个元素都是元组本身
tuple<int, int, int> tp = x;
//打印元组元素
cout << get<0>(tp) <<
' ' << get<1>(tp) <<
' ' << get<2>(tp) << '\n';
}
}
//主函数
int main()
{
//声明一个多重集合元组
multiset<tuple<int, int,
int>, cmp> multisetOfTuples;
//初始化元组
tuple<int, int,
int> tuple1;
tuple1 = make_tuple(1, 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(5, 8, 4);
//将元组插入多重集合
multisetOfTuples.insert(tuple1);
multisetOfTuples.insert(tuple2);
multisetOfTuples.insert(tuple3);
multisetOfTuples.insert(tuple4);
multisetOfTuples.insert(tuple5);
//调用打印函数
print(multisetOfTuples);
return 0;
}
输出:
5 8 4
2 3 5
2 3 5
2 1 4
1 2 3
时间复杂度: O(n log n)。 // n是插入到多重集合中的元组数。
辅助空间: O(n)。
说明:
在上面的输出中,多重集合中的元素按照非升序排列。具有值为(2, 3, 5)的元组在多重集合中有两个副本。