C++ STL中Multiset和Multimap的区别
C++中的对子。对容器是 <utility>
头中定义的一个简单容器,由两个数据元素或对象组成。第一个元素被称为 “第一”,第二个元素被称为 “第二”,其顺序是固定的(第一,第二)。Pair被用来将两个类型可能不同的值组合在一起。 Pair
提供了一种将两个异质对象作为一个单元来存储的方法。
语法:
pair (data_type1, data_type2) Pair_name;
C++中的 multiset
是一种关联容器,它按照特定的顺序存储元素,并且多个元素可以有相同的值。
语法:
multiset <data_type> Multiset_name;
Multimap: Multimap是一种关联容器,它与 map
类似,但有一个例外,即多个元素可以有相同的键。
语法:
multimap <data_type1, data_type2> Multimap_name
C++ STL中多集和多映射中的对有什么区别?
multiset和multimap这两种数据结构的默认行为都是以升序来存储元素。当一对多集被创建时,默认情况下,它将根据所有对的第一个元素以递增的顺序对所有对进行排序,如果任何两个或两个以上的对的第一个元素相等,那么它将根据对的第二个元素对其进行排序。
当一对多映射被创建时,默认情况下,它将根据所有对的第一个元素以递增的顺序对所有对进行排序,如果任何两个或两个以上的对的第一个元素相等,那么它将根据插入的顺序将对打印到多图的对。
下面的程序说明了这一区别 –
// C++ program print the data of
// multiset by inserting using pair
#include <bits/stdc++.h>
using namespace std;
// Function to print the data stored in pair of multiset
void printData(multiset<pair<int, string> > gfg)
{
// Declare iterator
multiset<pair<int, string> >::iterator i;
// Iterate through pair of multiset
for (i = gfg.begin(); i != gfg.end(); ++i) {
// Print the pairs
cout << i->first << " " << i->second << endl;
}
}
// Driver Code
int main()
{
// Declare pair of multiset
multiset<pair<int, string> > sets;
// Insert Data
sets.insert(make_pair(1, "yukti"));
sets.insert(make_pair(2, "umang"));
sets.insert(make_pair(3, "vinay"));
sets.insert(make_pair(3, "vijay"));
sets.insert(make_pair(4, "kanak"));
// Function call to print the data
printData(sets);
return 0;
}
解释一下:
在上面的程序中,我们已经创建了整数和字符串对,其中名称与每个整数配对,并插入到多集合中。根据多重集的默认行为,数据按照第一元素的升序排列,但当第一元素相同时,它将按照第二值排列这些元素。对于 (3, "vijay")
和 (3, "vinay")
这对数据, "vijay"
和 "vinay"
的第一个元素是相同的,所以它将根据第二个元素 "vijay"
和 "vinay"
来安排这些数据(按字母顺序)。
程序2:多映射中的配对
// C++ program print the data of multimap by inserting using pair
#include <bits/stdc++.h>
using namespace std;
// Function to print the data stored in pair of multimap
void printData(multimap<int, string> gfg)
{
// Declare iterator
multimap<int, string>::iterator i;
// Iterate through pair of multiset
for (i = gfg.begin(); i != gfg.end(); ++i) {
// Print the pairs
cout << i->first << " " << i->second << endl;
}
}
// Driver Code
int main()
{
// Declare pair of multimap
multimap<int, string> sets;
// Insert data
sets.insert(make_pair(1, "yukti"));
sets.insert(make_pair(2, "umang"));
sets.insert(make_pair(3, "vinay"));
sets.insert(make_pair(3, "vijay"));
sets.insert(make_pair(4, "kanak"));
// Function call to print the data
printData(sets);
return 0;
}
运行结果:
1 yukti
2 umang
3 vinay
3 vijay
4 kanak
上述代码的解释 –
在上面的程序中,我们再次插入了相同的对,但这次是在多映射中。根据 multi-map
的默认行为,数据是按照键的升序排列的,但是当键相同时,与 multi-set
不同,它将看到哪个元素先被插入的优先权,然后它将按照这个顺序排列。因此,在所示的输出中,可以看到,由于 "vinay"
和 "vijay"
的键3是相同的,所以它将遵循在多图中插入配对的顺序,这就是为什么在输出中 "vinay"
先于 "vijay"
出现。
多数据集中的配对 | 多映射 |
---|---|
在多数据集的对中,对被用来将键与特定的值映射。 | 默认行为是将元素作为一个键值对插入。 |
当一个多集的对被创建时,默认情况下,它将根据所有对的第一个元素以递增的顺序排序,如果任何两个或两个以上的对的第一个元素相等,那么它将根据对的第二个元素排序。 | 当创建一个多图对时,默认情况下,它将根据所有对的第一个元素以递增的顺序对所有对进行排序,如果任何两个或两个以上的对的第一个元素相等,那么它将根据插入多图对的顺序来打印该对。 |
语法: multiset<pair<int, string> > M; |
语法: multimap<int, string> M; |
在Multiset中插入一对的时间复杂度是O(log N) | 在Multimap中插入一对的时间复杂度是O(log N) |
在Multiset中删除配对的时间复杂度是O(N) | 在Multimap中删除配对的时间复杂度是不同的,没有指定。 |