• 容器————map


    序列容器是管理数据的宝贵工具,但对大多数应用程序而言,序列容器不提供方便的数据访问机制。一种典型的方法是通过名称来寻找地址。如果记录保存在序列容器中,就只能通过搜索得到这些数据。相比而言,map 容器提供了一种更有效的存储和访问数据的方法。

    map 容器是关联容器的一种。在关联容器中,对象的位置取决于和它关联的键的值。键可以是基本类型,也可以是类类型。字符串经常被用来作为键,如果想要保存姓名和地址的记录,就可以这么使用。

    map<K,T> 类模板定义在 map 文件头中,它定义了一个保存 T 类型对象的 map,每个 T 类型的对象都有一个关联的 K 类型的键。容器内对象的位置是通过比较键决定的。

    STL map 容器对元素的组织方式并没有具体要求,但元素一般都会保存在一个平衡二叉树中。

    从包含 n 个元素的平衡二叉树中检索一个随机元素所需的时间为 O(log2n),从序列中检索元素所需的时间为 O(n)

    创建

    map<key type,value type> m;
    
    map<key type,value type> m{std::make_pair(key1,value1),std::make_pair(key2,value2)}
    
    map<key type,value type> m{b};//用另一个map:b来初始化m,m容器中包含b元素副本
    
    map<key type,value type> m{b.begin(),b.begin()+3};//将map容器b的前三个用来构建m

    插入

    //定义一个map对象
    map<int,string> mapStudents;
    
    //第一种,使用insert函数插入pair
    mapStudents.insert(pair<int,string>(1,"student_one"));
    
    //第二种,使用insert函数插入value_type数据
    mapStudent.insert(map<int,string>::value_type(001,"stident_one"));
    
    //以上两种如果key已存在,inset操作不能插入数据的。但是使用数组方式就会覆盖掉以前key对应的value。
    //array方式
    mapStudents[123] = "student_first";
    map.insert(pair<char,int>('b',1));
    
    m.insert(m.begin(), pair<char, int>('a', 1));//在begin位置插入元素,也就是在原先map的begin位置前插入元素
    
    m2.insert(m1.begin(), m1.end());//用m1初始化m2
    
    m.insert(m.begin(), move(pair<char, int>('a', 1)));//将元素插入到begin前
    
    m.insert({{'e', 5}, {'a', 1}});//将这两个键值对插入到map中

    构造元素

    emplace()可以在适当的位置直接构造新元素,从而避免复制和移动操作。

    auto pr = m.emplace (key,value);

    查找元素

    //find返回迭代器指向当前查找元素的位置否则返回map::end()位置
    iter = mapStudent.find("123");
    if(iter != mapStudents.end()){
        //iter->second就是读取value值,iter->first就是读取key值
        cout << "find,the value is : " << iter -> second << endl;
    }
    else{
        cout << "don't find" << endl;
    }

    删除与清空元素

    //迭代器删除
    iter = mapStudent.find("001");
    mapStudent.erase(iter);
    
    //用关键字删除
    int n = mapStudent.erase("112");//如果删除了返回1,否则返回0
    
    //用迭代器删除,把整个map删除
    mapStudent.erase(mapStudent.begin(),mapStudent.end());

    map的大小

    int nSize = mapStudent.size();

    基本操作函数

    begin()         返回指向map头部的迭代器
    clear()        删除所有元素
    count()         返回指定元素出现的次数
    empty()         如果map为空则返回true
    end()           返回指向map末尾的迭代器
    equal_range()   返回特殊条目的迭代器对
    erase()         删除一个元素
    find()          查找一个元素
    get_allocator() 返回map的配置器
    insert()        插入元素
    key_comp()      返回比较元素key的函数
    lower_bound()   返回键值>=给定元素的第一个位置
    max_size()      返回可以容纳的最大元素个数
    rbegin()        返回一个指向map尾部的逆向迭代器
    rend()          返回一个指向map头部的逆向迭代器
    size()          返回map中元素的个数
    swap()           交换两个map
    upper_bound()    返回键值>给定元素的第一个位置
    value_comp()     返回比较元素value的函数
  • 相关阅读:
    Oracle:windows下,纯控制台方式(即前台,而不是后台服务)启动oracle实例、及tnslsnr实例
    创建本地离线 .deb包 仓库:ubuntu、debian、mint等:dpkgdev工具包中的“dpkgscanpackages”
    ubuntu22.04liveserveramd64.iso:安装界面的高级应用
    Golang 实现 Redis(11): RDB 文件格式 Finley
    Golang 实现 Redis(10): 本地原子性事务 Finley
    threadX
    嵌入式调试
    网络定位
    linux驱动移植usb驱动基础
    linux驱动移植LCD触摸屏驱动案例
  • 原文地址:https://www.cnblogs.com/pacino12134/p/11442562.html
Copyright © 2020-2023  润新知