您的位置:

Multimap的用法详解

一、基本介绍

Multimap是C++标准库中的容器之一,是一种关联式容器,其中动态存储数据,并能够根据键值对数据进行快速访问。与普通的Map不同的是,Multimap中可以同时存在相同的键值。Multimap使用二叉搜索树实现,比较的依据是键值对的比较结果。

一个Multimap包含了很多键值对,其中每一个键值对可以看作是一个节点。可以使用关键字来查找值。关键字可以有重复值,也就是说多个键值对可以有相同的关键字。值可以被修改,但是键不会被修改。Multimap模板定义在头文件中。

#include <iostream>
#include <map>

int main()
{
    std::multimap mymm;

    mymm.insert(std::pair
   ('x',10));
    mymm.insert(std::pair
    ('y',20));
    mymm.insert(std::pair
     ('z',30));
    mymm.insert(std::pair
      ('z',40));
    mymm.insert(std::pair
       
        ('z',50)); std::cout << "mymm contains:\n"; for (auto elem : mymm) std::cout << elem.first << " => " << elem.second << '\n'; return 0; }
       
      
     
    
   
  

二、插入元素

Multimap支持两种插入元素的方式——insert和emplace。其中,insert接受一个键值对作为参数,如果Multimap中已经存在相同的键,则插入新值,如果不存在,则插入整个键值对。emplace则直接接受键和值,然后在Multimap中进行排序并插入。

除了上述两种方法,Multimap还可以通过直接访问其迭代器来进行插入操作。

使用insert进行插入操作:

#include <iostream>
#include <map>

int main()
{
    std::multimap<char,int> mymm;

    mymm.insert(std::pair<char,int>('a',10));
    mymm.insert(std::pair<char,int>('b',20));
    mymm.insert(std::pair<char,int>('c',30));

    for (auto elem : mymm)
        std::cout << elem.first << " => " << elem.second << '\n';

    return 0;
}

使用emplace进行插入操作:

#include <iostream>
#include <map>

int main()
{
    std::multimap<char,int> mymm;

    mymm.emplace('a',10);
    mymm.emplace('b',20);
    mymm.emplace('c',30);

    for (auto elem : mymm)
        std::cout << elem.first << " => " << elem.second << '\n';

    return 0;
}

使用迭代器进行插入操作:

#include <iostream>
#include <map>

int main()
{
    std::multimap<char,int> mymm;

    auto it = mymm.emplace('a',10);
    mymm.emplace_hint(it,'b',20);
    mymm.emplace_hint(mymm.end(),'c',30);

    for (auto elem : mymm)
        std::cout << elem.first << " => " << elem.second << '\n';

    return 0;
}

三、查找元素

Multimap支持多种查找元素的方式,其中find、count、equal_range和lower_bound是比较常用的。其中,find接受一个键,返回Multimap中指向对应元素的迭代器。如果Multimap中不存在该键,则返回Multimap的end迭代器。count接受一个键,返回Multimap中该键对应元素的个数。equal_range则返回一个pair对象,其中first是指向Multimap中首个匹配元素的迭代器,second是指向Multimap中最后一个匹配元素之后的迭代器。lower_bound也返回与当前键匹配的第一个元素的迭代器。

使用find查找元素:

#include <iostream>
#include <map>

int main()
{
    std::multimap<char,int> mymm;

    mymm.emplace('a',10);
    mymm.emplace('b',20);
    mymm.emplace('c',30);

    auto it = mymm.find('b');

    std::cout << "Key found: " << it->first << " = " << it->second << '\n';

    return 0;
}

使用count查找元素:

#include <iostream>
#include <map>

int main()
{
    std::multimap<char,int> mymm;

    mymm.emplace('a',10);
    mymm.emplace('b',20);
    mymm.emplace('c',30);

    int count = mymm.count('b');

    std::cout << "Number of values with key 'b': " << count << '\n';

    return 0;
}

使用equal_range查找元素:

#include <iostream>
#include <map>

int main()
{
    std::multimap<char,int> mymm;

    mymm.emplace('a',10);
    mymm.emplace('b',20);
    mymm.emplace('c',30);

    auto range = mymm.equal_range('b');

    for (auto it = range.first; it != range.second; it++)
        std::cout << it->first << " => " << it->second << '\n';

    return 0;
}

使用lower_bound查找元素:

#include <iostream>
#include <map>

int main()
{
    std::multimap<char,int> mymm;

    mymm.emplace('a',10);
    mymm.emplace('b',20);
    mymm.emplace('c',30);

    auto it = mymm.lower_bound('b');

    std::cout << "Key found: " << it->first << " = " << it->second << '\n';

    return 0;
}

四、删除元素

与插入元素类似,Multimap支持多种删除元素的方式,其中erase接受一个元素的迭代器,删除对应的元素。remove则接受一个键,删除该键对应的所有元素。

使用erase删除元素:

#include <iostream>
#include <map>

int main()
{
    std::multimap<char,int> mymm;

    mymm.emplace('a',10);
    mymm.emplace('b',20);
    mymm.emplace('c',30);

    auto it = mymm.find('b');
    mymm.erase(it);

    for (auto elem : mymm)
        std::cout << elem.first << " => " << elem.second << '\n';

    return 0;
}

使用remove删除元素:

#include <iostream>
#include <map>

int main()
{
    std::multimap<char,int> mymm;

    mymm.emplace('a',10);
    mymm.emplace('b',20);
    mymm.emplace('c',30);
    mymm.emplace('b',40);

    mymm.erase('b');

    for (auto elem : mymm)
        std::cout << elem.first << " => " << elem.second << '\n';

    return 0;
}

五、其他操作

Multimap支持许多其他的操作,包括size(返回Multimap中元素的数量)、empty(如果Multimap为空则返回true)、swap(交换两个Multimap中的元素)、clear(清除Multimap中的所有元素)等。

使用size获取Multimap中元素数量:

#include <iostream>
#include <map>

int main()
{
    std::multimap<char,int> mymm;

    mymm.emplace('a',10);
    mymm.emplace('b',20);
    mymm.emplace('c',30);

    std::cout << "The size of the Multimap is " << mymm.size() << '\n';

    return 0;
}

使用empty判断Multimap是否为空:

#include <iostream>
#include <map>

int main()
{
    std::multimap<char,int> mymm;

    std::cout << "The Multimap is " << (mymm.empty() ? "empty" : "not empty") << '\n';

    return 0;
}

使用swap交换两个Multimap中的元素:

#include <iostream>
#include <map>

int main()
{
    std::multimap<char,int> mymm1;
    std::multimap<char,int> mymm2;

    mymm1.emplace('a',10);
    mymm1.emplace('b',20);
    mymm1.emplace('c',30);

    mymm2.emplace('x',40);
    mymm2.emplace('y',50);

    mymm1.swap(mymm2);

    for (auto elem : mymm2)
        std::cout << elem.first << " => " << elem.second << '\n';

    return 0;
}

使用clear清除Multimap中的所有元素:

#include <iostream>
#include <map>

int main()
{
    std::multimap<char,int> mymm;

    mymm.emplace('a',10);
    mymm.emplace('b',20);
    mymm.emplace('c',30);

    mymm.clear();

    std::cout << "The Multimap is " << (mymm.empty() ? "empty" : "not empty") << '\n';

    return 0;
}