map映照容器
map映照容器的元素数据是由一个键值和一个映照数据组成的, 键值与映照数据之间具有一一映照关系.
map映照容器的数据结构也是采用红黑树来实现的, 插入元素的键值不允许重复, 比较函数只对元素的键值进行比较, 元素的各项数据可通过键值检索出来. 由于map与set采用的都是红黑树的数据结构, 所以, 用法基本相似.
 
键值                映照数据
Name             Score
Jack                 98.5
Bomi               96.0
Kate                97.5
 
使用map容器需要包含头文件"#include<map>", map文件包含了对multimap多重映照容器的定义.
 
1.1map创建, 插入元素和遍历访问
创建map对象, 键值与映照数据的类型由自己去定义. 在没有指定比较函数时, 元素的插入位置是按键值由小到大到红黑树中去的, 这点和set一样. 下面这个程序详细的说明了如何操作map容器.
#include<map>
#include<string>
#include<iostream>
using namespace std;
 
int main()
{
    //定义map对象, 当前没有任何元素
    map<string, float> m;
    //插入元素, 按键值的由小到大放入红黑树中
    m["Jack"] = 98.5;
    m["Bomi"] = 96.0;
    m["Kate"] = 97.5;
    //向前遍历元素
    map<string, float>::iterator it;
    for(it = m.begin(); it != m.end(); it++)
    {
        //输出键值与映照数据
        cout << (*it).first << " : " << (*it).second << endl;
    }
    return 0;
}
/*
Bomi : 96
Jack : 98.5
Kate : 97.5
*/
 
1.2删除元素
与set容器一样, map映照容器的erase()删除元素函数, 可以删除某个迭代器位置上的元素, 等于某个键值的元素, 一个迭代器区间上的所有元素, 当然, 也可以使用clear()方法清空map映照容器.
下面这个程序演示了删除map容器中键值为28的元素:
#include<map>
#include<string>
#include<iostream>
using namespace std;
 
int main()
{
    //定义map对象, 当前没有任何元素
    map<int , char> m;
    //插入元素, 按键值的由小到大放入红黑树中
    m[25] = 'm';
    m[28] = 'k';
    m[10] = 'x';
    m[30] = 'a';
    //删除值为28的元素
    m.erase(28);
    //前向遍历元素
    map<int, char>::iterator it;
    for(it = m.begin(); it != m.end(); it++)
    {
        //输出键值与映照数据
        cout << (*it).first << " : " << (*it).second << endl;
    }
    return 0;
}
 
/*
10 : x
25 : m
30 : a
*/
 
1.3元素反向遍历
可以使用反向迭代器reverse_iterator反向遍历map映照容器中的数据, 它需要rbegin()方法和rend()方法指出反向遍历的起始位置和终止位置.
#include<map>
#include<string>
#include<iostream>
using namespace std;
 
int main()
{
    //定义map对象, 当前没有任何元素
    map<int,char> m;
    //插入元素, 按键值的由小到大放入红黑树中
    m[25] = 'm';
    m[28] = 'k';
    m[10] = 'x';
    m[30] = 'a';
    //反向遍历元素
    map<int, char>::reverse_iterator rit;
    for(rit = m.rbegin(); rit != m.rend(); rit++)
    {
        //输出键值与映照数据
        cout << (*rit).first << " : " << (*rit).second << endl;
    }
    return 0;
}
/*
30 : a
28 : k
25 : m
10 : x
*/
 
1.4元素的搜索
使用find()方法来搜索某个键值, 如果搜索到了, 则返回该键值所在的迭代器位置, 否则, 返回end()迭代器位置. 由于map采用红黑树数据结构来实现, 所以搜索速度是极快的.
下面这个程序搜索键值为28的元素:
#include<map>
#include<string>
#include<iostream>
using namespace std;
 
int main()
{
    map<int, char> m;
    //插入元素, 按键值的由小到大顺序放入红黑树中
    m[25] = 'm';
    m[28] = 'k';
    m[10] = 'x';
    m[30] = 'a';
    map<int, char>::iterator it;
    it = m.find(28);
    if(it != m.end())
    {
        cout << (*it).first << " : " << (*it).second << endl;
    }
    else
    {
        cout << "not found it" << endl;
    }
    return 0;
}
 
/*
28 : k
*/
 
1.5自定义比较函数
将元素插入到map中去的时候, map会根据设定的比较函数将该元素放到该放的节点上去. 在定义map的时候, 如果没有指定比较函数, 那么采用默认的比较函数, 即按键值由小到大的顺序插入元素. 在很多情况下, 需要自己编写比较函数.
编写比较函数与set比较函数是一致的, 因为它们的内部数据结构都是红黑树. 编写方法有两种:
(1)如果元素不是结构体, 那么, 可以编写比较函数规则是要求按键值由大到小的顺序将元素插入到map中:
#include<map>
#include<string>
#include<iostream>
using namespace std;
 
//自定义比较函数myComp
struct myComp
{
    bool operator() (const int &a, const int &b)
    {
        if(a != b) return a > b;
        else    return a > b;
    }
};
 
int main()
{
    //定义map对象, 当前没有任何元素
    map<int, char, myComp> m;
    //插入元素, 按键值的由小到大放入红黑树中
    m[25] = 'm';
    m[28] = 'k';
    m[10] = 'x';
    m[30] = 'a';
    //使用前向迭代器中序遍历map
    map<int, char, myComp>::iterator it;
    for(it = m.begin(); it != m.end(); it++)
    {
        cout << (*it).first << " : " << (*it).second << endl;
    }
    return 0;
}
 
/*
30 : a
28 : k
25 : m
10 : x
*/
 
(2)如果元素是结构体, 那么, 可以直接把比较函数写在结构体内. 下面的程序详细说明了如何操作:
#include<map>
#include<string>
#include<iostream>
using namespace std;
 
struct Info
{
    string name;
    float score;
    //重载"<"操作符, 自定义排序规则
    bool operator < (const Info &a) const
    {
        //按score由大到小排列. 如果要由小到大排列, 使用">"号即可
        return a.score < score;
    }
};
 
int main()
{
    //定义map对象, 当前没有任何元素
    map<Info, int> m;
    //定义Info结构体变量
    Info info;
    //插入元素, 按键值的由小到大放入红黑树中
    info.name = "Jack";
    info.score = 60;
    m[info] = 25;
    info.name = "Bomi";
    info.score = 80;
    m[info] = 10;
    info.name = "Peti";
    info.score = 66.5;
    m[info] = 30;
    //使用前向迭代器中序遍历map
    map<Info, int>::iterator it;
    for(it = m.begin(); it != m.end(); it++)
    {
        cout << (*it).second << " : ";
        cout << ((*it).first).name << " " << ((*it).first).score << endl;
    }
    return 0;
}
 
/*
10 : Bomi 80
30 : Peti 66.5
25 : Jack 60
*/
P51

C++STL之map映照容器的更多相关文章

  1. map映照容器(常用的使用方法总结)

    map映照容器的数据元素是由一个键值和一个映照数据组成的,键值和映照数据之间具有一一对应的关系.map与set集合容器一样,不允许插入的元素的键值重复. /*关于C++STL中map映照容器的学习,看 ...

  2. C++ map 映照容器

    map映照容器的元素数据是一个键值和一个映照数据组成的,键值与映照数据之间具有一一映照的关系. map映照容器的数据结构是采用红黑树来实现的,插入键值的元素不允许重复,比较函数只对元素的键值进行比较, ...

  3. map映照容器的使用

    map映照容器可以实现各种不同类型数据的对应关系,有着类似学号表的功能. 今天在做并查集的训练时,就用上了map映照容器. 题目就不上了,直接讲一下用法.顺便说一下,实现过程是在C++的条件下. #i ...

  4. map映照容器

    //map映照容器是由一个键值和一个映照数据组成的,键值与映照数据之间具有一一映照的关系 //map映照容器的键值不允许重复 ,比较函数值对元素 //的键值进行比较,元素的各项数据可通过键值检索出来 ...

  5. 统计频率(map映照容器的使用)

    问题描述  AOA非常喜欢阅读莎士比亚的诗,莎士比亚的诗中有种无形的魅力吸引着他!他认为莎士比亚的诗中之所以些的如此传神,应该是他的构词非常好!所以AOA想知道,在莎士比亚的书中,每个单词出现的频率各 ...

  6. POJ 1002 487-3279(map映照容器的使用)

    Description Businesses like to have memorable telephone numbers. One way to make a telephone number ...

  7. zoj 2104 Let the Balloon Rise(map映照容器的应用)

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2104 题目描述: Contest time again! Ho ...

  8. zoj 1109 Language of FatMouse(map映照容器的典型应用)

    题目连接: acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1109 题目描述: We all know that FatMouse doe ...

  9. C++STL之set集合容器

    set集合容器 set集合容器实现了红黑树(Red-Black Tree)的平衡二叉检索树的数据结构, 在 插入元素时, 它会自动调整二叉树的排列, 把该元素放到适当的位置, 以确保每个子树根节点的键 ...

随机推荐

  1. php数组·的方法-数组检索

    /* * //数组检索函数 * */ //array_keys() 获取数组中所有键名 //array_values() 获取数组中所有键名 $arr6=range('a','e'); print_r ...

  2. Django 中orm的第一次举荐

    Django ORM :对象--关系--映射 创建Django准备工作: 1.在数据库创建你需要的数据库 2.在项目models里创建模型(就是python写的类,也可以说是python写的数据库) ...

  3. 性能测试工具LoadRunner09-LR之Virtual User Generator 日志

    在录制和回放的时候,VU会分别把发生的事件记录成日志文件,这些日志有利于我们跟踪VU和服务器的交互过程 回放日志(Replay Log) 脚本回放运行时的输出都记在这个Log里 “输出”窗口的“回放日 ...

  4. linux_api之文件操作

    本篇索引: 1.引言 2.文件描述符 3.open函数 4.close函数 5.read函数 6.write函数 7.lseek函数 8.i/o效率问题 9.内核用以维护打开文件的相关数据结构 10. ...

  5. Misc1

    什么是编译进内核与制作成模块 编译进内核意味着内核对这一类的功能不会在依赖其他的东西, 说白了就是所谓静态编译, 内核在启动的时候就会拥有这一部分的功能, 但是这样内核的体积就会变大 编译成模块, 其 ...

  6. GitKraken使用教程-基础部分(9)

    10.  合并分支并解决冲突(conflict) 1) 合并分支 在代码管理过程中,切换分支或者同步服务器代码时,常常会出现代码冲突的情况,这种情况出现的原因一般是由于两个分支对同一个文件进行修改, ...

  7. 乐蜂网SALES倒计时原码展示

    这是一个基于jquey写的倒计时.当然代码有点小改动,只是改了一下展示效果. 在静态页添加显示倒计时的容器,并引用下面脚本,代入时间参数即可使用. timeoutDate——到期时间,时间格式为201 ...

  8. Dubbo分布式日志追踪

    使用dubbo分布式框架进行微服务的开发,一个大系统往往会被拆分成很多不同的子系统,并且子系统还会部署多台机器,当其中一个系统出问题了,查看日志十分麻烦. 所以需要一个固定的流程ID和机器ip地址等来 ...

  9. vue2.0高仿饿了么better-scroll

    首先安装better-scroll npm i better-scroll -S goods页面模板 <template> <div class="goods"& ...

  10. Android getRunningTasks和getRunningAppProcesses失效

    Android 5.0以上的getRunningTasks失效,该方法可以获得在前台运行的系统进程.可以用getRunningAppProcesses方法暂时替代. android6.0以上的getR ...