C++ STL中Multiset和Multimap中Pair的差异
C++ STL提供了Multiset和Multimap两种容器来存储一组按照某个比较规则排序的元素,它们都是通过红黑树来实现的。两者最大的不同点在于Multimap可以存储键值相同的元素,而Multiset只能存储键值不同的元素。比如,在Multimap中,可以同时存储多个成绩为90分的学生,而在Multiset中,只能存储一个成绩为90分的学生。
对于两种容器中存储的元素,C++ STL中也提供了Pair来表示。Pair是一种结构体模板,包含两个数据成员:first和second。在Multiset中,Pair的first和second都表示同一个元素,而在Multimap中,Pair的first表示键值,second表示值。
Multiset中使用Pair
在Multiset中,Pair的first和second都表示同一个元素。例如,我们有一个Multiset来存储整型数据,我们可以这样使用Pair:
#include <iostream>
#include <set>
using namespace std;
int main()
{
multiset<pair<int,int>> data;
data.insert({1,2});
data.insert({3,4});
data.insert({1,5});
for (auto it = data.begin(); it != data.end(); ++it)
cout << it->first << "-" << it->second << " ";
return 0;
}
输出结果:1-2 1-5 3-4
我们可以看到,虽然在初始化multiset时,我们加入了三个不同的Pair {1,2}、 {3,4}和 {1,5},但是程序输出的结果中,我们发现它们的值都被存储到了Multiset中。
Multimap中使用Pair
在Multimap中,Pair的first表示键值,second表示值。例如,我们有一个Multimap来存储学生的成绩,我们可以这样使用Pair:
#include <iostream>
#include <map>
using namespace std;
int main()
{
multimap<int,string> data;
data.insert(make_pair(90, "Alice"));
data.insert(make_pair(80, "Bob"));
data.insert(make_pair(90, "Cathy"));
for (auto it = data.begin(); it != data.end(); ++it)
cout << it->first << "-" << it->second << " ";
return 0;
}
输出结果:80-Bob 90-Alice 90-Cathy
我们可以看到,Multimap中可以存储键值相同的Pair {90, “Alice”}和 {90, “Cathy”}。
结论
总的来说,Multiset和Multimap都是通过红黑树来实现的。Multiset只能存储键值不同的元素,而Multimap可以存储键值相同的元素。Pair在Multiset中表示同一个元素,而在Multimap中,表示的是键值和值。在实际的使用中,我们可以根据具体需要选择使用哪种容器及其元素类型。