在C++ STL中的Multimap与Map的比较及示例
C++ STL中有许多重要的容器类,在这些容器中,Map和Multimap都是非常常用的。虽然两个容器都是用于存储键值对,但它们的实现逻辑和使用场景还是有所不同的,接下来我们将分别介绍Map和Multimap的使用方法和比较。
Map的使用方法
Map是一个关联容器,它提供了一种将键值对映射关系存储在一起的方式。可以通过键来访问对应的值,并且键不能重复。Map内部通过一颗红黑树来维护元素之间的关联关系,因此具有较快的查找和遍历速度。我们可以通过以下代码创建并使用Map:
#include <map>
#include <iostream>
using namespace std;
int main() {
// 创建一个空的map
map<int, string> myMap;
// 插入键值对
myMap.insert(pair<int,string>(1,"apple"));
myMap.insert(pair<int,string>(2,"banana"));
myMap.insert(pair<int,string>(3,"orange"));
// 访问元素
cout << "Value of key 1 is: " << myMap[1] << endl;
// 遍历map
for (auto iter = myMap.begin(); iter != myMap.end(); iter++) {
cout << iter->first << ": " << iter->second << endl;
}
return 0;
}
上述代码中,我们首先创建了一个空的Map对象myMap,并通过insert方法插入了3个键值对。然后分别通过[]运算符和迭代器访问和遍历了Map中的元素。需要注意的是,如果访问不存在的键,则会自动插入一个空的值到Map中。
Multimap的使用方法
Multimap也是一个关联容器,它与Map不同的是,Multimap中允许键重复,并且内部实现并不要求键的元素次序,相同键的元素会存储在相邻的位置上。Multimap同样使用红黑树维护元素之间的关联关系。我们可以通过以下代码创建并使用Multimap:
#include <map>
#include <iostream>
using namespace std;
int main() {
// 创建一个空的multimap
multimap<int, string> myMultiMap;
// 插入键值对
myMultiMap.insert(pair<int,string>(1,"apple"));
myMultiMap.insert(pair<int,string>(2,"banana"));
myMultiMap.insert(pair<int,string>(3,"orange"));
myMultiMap.insert(pair<int,string>(1,"grape"));
myMultiMap.insert(pair<int,string>(2,"kiwi"));
// 访问元素
cout << "Values of key 1 are: ";
auto range = myMultiMap.equal_range(1);
for (auto iter = range.first; iter != range.second; iter++) {
cout << iter->second << ", ";
}
cout << endl;
// 遍历multimap
for (auto iter = myMultiMap.begin(); iter != myMultiMap.end(); iter++) {
cout << iter->first << ": " << iter->second << endl;
}
return 0;
}
上述代码中,我们首先创建了一个空的Multimap对象myMultiMap,并通过insert方法插入了5个键值对,包括了两个重复的键。然后通过equal_range方法访问了键为1的所有值,并通过迭代器遍历了整个Multimap。
Map和Multimap的比较
Map和Multimap在实现和使用上都存在一些差异,因此它们在不同的场景下有不同的适用性。下面我们将对它们进行比较。
键的重复性
Map中键是唯一的,而Multimap中键允许重复。如果我们需要在键可以重复的情况下存储元素,那么就应该使用Multimap。
元素的查找
对于Map和Multimap,都可以通过键值对来访问元素。但是,由于Multimap中键可以重复,因此访问方式略有不同。当访问Map中不存在的键时,会自动创建一个空的元素并返回。而在Multimap中,由于可能存在多个值,因此我们需要通过equal_range方法来访问所有的值。
迭代器
Map和Multimap的迭代器用法是相同的,在使用时,都可以使用auto关键字来简化迭代器的声明和使用。当访问元素时,我们可以通过迭代器来获取键和值。需要注意的是,由于Multimap中存在相同的键,因此迭代器在遍历时可能会遍历相同键的多个元素。
性能
Map和Multimap的底层实现都是通过红黑树实现的,因此它们的查找和插入操作的复杂度都是O(log n)级别的。同时,由于Multimap允许键重复,因此在某些情况下可能会导致一定的性能下降。因此,在选择Map和Multimap时,需要根据具体场景进行选择,以保证程序性能的最优化。
结论
Map和Multimap是C++ STL中非常常用的关联容器,它们在实现和使用上都存在一定的差异。在使用时,需要根据具体的场景和需求来选择合适的容器,以达到最优性能和效果。