zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    CRMEB FormBuilder
    CRMEB 异常
    Layui select
    VS 发布报错 NETSDK1152: 找到了多个具有相同相对路径的发布输出文件
    Layui 文档 官网镜像
    datetimepicker 日期显示 年视图 月视图
    SpringBoot
    RabbitMQ
    Shiro
    SpringMVC
  • 原文地址:https://www.cnblogs.com/lzy820260594/p/11395449.html
Copyright © 2011-2022 走看看