C++中的元组多重映射及示例
什么是多重映射?
在C++中,多重映射是一种关联式容器,用于以映射方式存储元素。内部,多重映射被实现为红黑树。多重映射的每个元素都被视为一对。第一个值称为键,第二个值称为值。多重映射与映射非常相似,但在多重映射的情况下,可以有多个相同的键。此外,不能使用方括号([])访问与键映射的值。像映射一样,多重映射的键默认按升序排序。
与多重映射相关的函数:
- begin() : 返回指向多重映射中第一个元素的迭代器。
- end() : 返回指向多重映射中最后一个元素的下一个理论元素的迭代器。
- size() : 返回多重映射中元素的数量。
- max_size() : 返回多重映射可以容纳的最大元素数。
- empty() : 返回多重映射是否为空。
- insert(key, Value) : 将新元素或对添加到多重映射中。
- erase(iterator position) : 删除由迭代器指向的位置处的元素。
- erase(const x) : 从多重映射中删除键值“x”。
- clear() : 从多重映射中删除所有元素。
什么是元组?
在C++中,元组是用于将元素分组的对象。在元组中,元素可以是相同的数据类型或不同的数据类型。元组的元素按访问顺序初始化。
与元组配合使用的函数:
- make_tuple(): 用于为元组分配值。传递的值应按照元组中声明的值的顺序进行。
- get(): 用于访问元组值并对其进行修改,它接受索引和元组名称作为参数以访问特定的元组元素。
如何访问元组?
使用get<>()函数来访问元组的元素。
语法:
**auto fistElement = get <0>(myTuple); **
**auto secondElement = get <1>(myTuple); **
**auto thirdElement = get <2>(myTuple); **
本文重点介绍如何在C++中创建元组的多重映射。
元组的多重映射
元组的多重映射是一种多重映射,在其中键或值之一本身就是元组。如果两个元组的对应的第一个、第二个和第三个元素相等,则认为它们相等。现在,如果需要存储多于一个元组的副本以及其他元素,而且还需要以排序或特定顺序进行维护,这时元组的多重映射就非常有用了。
语法:
**multimap <tuples<dataType1, dataType2, dataType3>> myMultimap; **
在这里,
dataType1, dataType2, dataType3 可以是相似或不同的数据类型。
示例1: 下面是一个C++程序,演示了元组的多重映射情况的工作原理。
// C++程序演示了一个
// 元组的multimap的工作原理。
#include <bits/stdc++.h>
using namespace std;
// 函数打印multimap元素
void print(multimap<tuple<int, int, int>,
bool>& myContainer)
{
cout << "Key(由整数tuple组成)" <<
" " <<
"Value(布尔值)\n\n";
for (auto currentTuple : myContainer)
{
//multiset的每个元素本身是一个pair,
//其中Key是tuple类型
tuple<int, int, int> Key = currentTuple.first;
//Value是一个布尔值
bool value = currentTuple.second;
//打印key元素和value值
cout << '[' << get<0>(Key) << " , " <<
get<1>(Key) << " , " << get<2>(Key) <<
']' << " " <<
value << '\n';
}
}
// 驱动代码
int main()
{
// 声明multimap
// Key是tuple<int, int, int>类型
// Value是bool类型
multimap<tuple<int, int, int>,
bool> myContainer;
// 创建用作key的一些元组
tuple<int, int, int> tuple1;
tuple1 = make_tuple(100, 200, 300);
tuple<int, int, int> tuple2;
tuple2 = make_tuple(200, 300, 400);
tuple<int, int, int> tuple3;
tuple3 = make_tuple(300, 400, 500);
tuple<int, int, int> tuple4;
tuple4 = make_tuple(100, 200, 300);
//由于multimap中每个元素本身都是一个元组,
//所以我们插入了一个元组
//请注意,[]运算符在multimap的情况下无效
myContainer.insert(pair<tuple<int, int, int>,
bool>(tuple1, true));
myContainer.insert(pair<tuple<int, int, int>,
bool>(tuple2, false));
myContainer.insert(pair<tuple<int, int, int>,
bool>(tuple3, true));
myContainer.insert(pair<tuple<int, int, int>,
bool>(tuple4, false));
//调用print函数
print(myContainer);
return 0;
}
输出
Key(由整数tuple组成) Value(布尔值)
[100, 200, 300] 1
[100, 200, 300] 0
[200, 300, 400] 0
[300, 400, 500] 1
示例2: 下面是演示tuple的multimap的工作原理的C++程序。
// C++程序演示了元组的多重映射的工作方式。
#include <bits/stdc++.h>
using namespace std;
//打印多重映射元素的函数
void print(multimap<tuple<string, int, float>,
bool>& myContainer)
{
cout << "Key(tuple of integers)" <<
" " <<
"Value(boolean)\n\n";
for (auto currentTuple : myContainer)
{
//每个多重集的元素本身都是一个元组
//键是一个元组类型
tuple<string, int, float> Key =
currentTuple.first;
//值是布尔值
bool value = currentTuple.second;
//打印键元素和值
cout << '[' << get<0>(Key) << " , " <<
get<1>(Key) << " , " << get<2>(Key) <<
']' << " " <<
value << '\n';
}
}
//驱动代码
int main()
{
//声明一个多重映射
//键类型为元组<字符串,整数,浮点数>
//值类型为布尔值
multimap<tuple<string, int, float>,
bool> myContainer;
//创建一些元组作为键
tuple<string, int, float> tuple1;
tuple1 = make_tuple("Java", 100, 1.123);
tuple<string, int, float> tuple2;
tuple2 = make_tuple("Geek", 200, 2.123);
tuple<string, int, float> tuple3;
tuple3 = make_tuple("HTML", 300, 3.123);
tuple<string, int, float> tuple4;
tuple4 = make_tuple("Java", 100, 1.123);
//由于每个元素在多重映射中本身就是一个元组。所以我们插入了一个元组
//注意,[]运算符在多重映射中不起作用
myContainer.insert(pair<tuple<string, int, float>,
bool>(tuple1, true));
myContainer.insert(pair<tuple<string, int, float>,
bool>(tuple2, false));
myContainer.insert(pair<tuple<string, int, float>,
bool>(tuple3, true));
myContainer.insert(pair<tuple<string, int, float>,
bool>(tuple4, false));
//调用打印函数
print(myContainer);
return 0;
}
输出结果
Key(tuple of integers) Value(boolean)
[Geek, 200, 2.123] 0
[HTML, 300, 3.123] 1
[Java, 100, 1.123] 1
[Java, 100, 1.123] 0