STL之map容器和multimap容器

时间:2019-08-22
本文章向大家介绍STL之map容器和multimap容器,主要包括STL之map容器和multimap容器使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

摘要:本文主要介绍了map容器和multimap容器的相关内容。

1、基本概念

1.1 Map的特性

所有元素都会根据元素的键值自动排序。Map所有的元素都是pair,同时拥有实值和键值,pair的第一元素被视为键值,第二元素被视为实值,map不允许两个元素有相同的键值。

1.1 map容器的键值无法修改

map的键值关系到map元素的排列规则,任意改变map键值将会严重破坏map组织。如果想要修改元素的实值,那么是可以的。

Map和list拥有相同的某些性质,当对它的容器元素进行新增操作或者删除操作时,操作之前的所有迭代器,在操作完成之后依然有效,当然被删除的那个元素的迭代器必然是个例外。

1.2 Multimap容器

Multimap和map的操作类似,唯一区别multimap键值可重复。

Map和multimap都是以红黑树为底层实现机制。

2、常用的API

  API 意义
构造函数

    map<T1, T2> mapTT

map默认构造函数
map(const map &mp) 拷贝构造函数
赋值操作

map& operator=(const map &mp)

重载等号操作符
swap(mp) 交换两个集合容器
大小操作

size()

返回容器中元素的数目
empty() 判断容器是否为空
插入数据元素操作

map.insert(...); //往容器插入元素,返回pair<iterator,bool>

map<int, string> mapStu;

往容器插入元素,返回pair<iterator,bool> map<int, string> mapStu;

第一种 通过pair的方式插入对象

mapStu.insert(pair<int, string>(3, "小张"));

第二种 通过pair的方式插入对象

mapStu.inset(make_pair(-1, "校长"))
第三种 通过value_type的方式插入对象 mapStu.insert(map<int, string>::value_type(1, "小李"))
第四种 通过数组的方式插入值

mapStu[3] = "小刘";mapStu[5] = "小王";

删除操作

clear()

删除所有元素
erase(pos) 删除pos迭代器所指的元素,返回下一个元素的迭代器
erase(beg,end) 删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器
erase(keyElem) 删除容器中key为keyElem的对组

查找操作

find(key)

查找键key是否存在,若存在,返回该键的元素的迭代器;/若不存在,返回map.end()
count(keyElem)

返回容器中key为keyElem的对组个数。对map来说,要么是0,要么是1。对multimap

来说,值可能大于1

lower_bound(keyElem) 返回第一个key>=keyElem元素的迭代器
upper_bound(keyElem) 返回第一个key>keyElem元素的迭代器
equal_range(keyElem) 返回容器中key与keyElem相等的上下限的两个迭代器

3、代码示例

  1 #include <iostream>
  2 #include<map>
  3 #include <algorithm>
  4 
  5 using namespace std;
  6 
  7 void test01() {
  8     map<int, int>m;  //注意和其他容器相区分,一个是序号另外一个是键值
  9     m.insert(pair<int,int>(1,10));  //这里运用四种方法给map容器插值
 10     m.insert(make_pair(2,20));
 11     m.insert(map<int,int>::value_type(3,30));
 12     m[4] = 40;
 13 
 14     for (map<int,int>::iterator it=m.begin();it!=m.end();it++)
 15     {
 16         cout << it->first << "  " << (*it).second << endl;
 17     }
 18 
 19     if(m.empty())
 20     {
 21         cout << "" << endl;
 22     }
 23     else
 24     {
 25     cout << "size = " << m.size() << endl;
 26     }
 27 }
 28 
 29 void test02() {
 30     map<int, int> m;
 31     m.insert(pair<int, int>(1, 10));
 32     m.insert(make_pair(2, 20));
 33     m.insert(map<int, int>::value_type(3, 30));
 34     m[4] = 40;
 35 
 36     m.erase(1);  //直接将第一个值删除
 37     for (map<int, int>::iterator it = m.begin(); it != m.end(); it++)
 38     {
 39         cout << "key = " << it->first << " value" << it->second << endl;
 40     }
 41 
 42     map<int, int>::iterator pos = m.find(2); //查找
 43     if (pos != m.end())
 44     {
 45         cout << "找到:key" << pos->first << " value:" << pos->second << endl;
 46     }
 47     else
 48     {
 49         cout << "未找到" << endl;
 50     }
 51 
 52     int num = m.count(3); //map的count 要么0 要么1 
 53     cout << "num = " << num << endl;
 54 
 55     // lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。
 56 
 57     map<int, int>::iterator ret = m.lower_bound(3);
 58     if (ret != m.end())
 59     {
 60         cout << "lower_bound 中key" << ret->first << " value: " << ret->second << endl;
 61     }
 62     else
 63     {
 64         cout << "未找到" << endl;
 65     }
 66 
 67     //upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器。
 68     ret = m.upper_bound(3);
 69     if (ret != m.end())
 70     {
 71         cout << "upper_bound 中key" << ret->first << " value: " << ret->second << endl;
 72     }
 73     else
 74     {
 75         cout << "未找到" << endl;
 76     }
 77 
 78     //equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。
 79 
 80     pair<map<int, int>::iterator, map<int, int>::iterator> ret2 = m.equal_range(3);
 81 
 82     if (ret2.first != m.end())
 83     {
 84         cout << "找到了equal_range 中的lower_bound 的key " << ret2.first->first << " value: " << ret2.first->second << endl;
 85     }
 86     else
 87     {
 88         cout << "未找到" << endl;
 89     }
 90 
 91     if (ret2.second != m.end())
 92     {
 93         cout << "找到了equal_range 中的upper_bound 的key " << ret2.second->first << " value: " << ret2.second->second << endl;
 94     }
 95     else
 96     {
 97         cout << "未找到" << endl;
 98     }
 99 }
100 bool myCompare(int &v1, int &v2){
101         return v1 > v2;
102 }
103 
104 int main() {
105     //test01();
106     test02();
107     system("pause");
108     return 0;
109

原文地址:https://www.cnblogs.com/lzy820260594/p/11395449.html