在C++ STL中的Multimap与Map的比较及示例

在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中非常常用的关联容器,它们在实现和使用上都存在一定的差异。在使用时,需要根据具体的场景和需求来选择合适的容器,以达到最优性能和效果。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程