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. 转 Comparison of Red Hat and Oracle Linux kernel versions and release strings

    Originally derived from Red Hat Enterprise Linux (RHEL), Oracle Linux (OL) contains minor difference ...

  2. table size script :

    I think Jonathan Lewis has explained the algorithm before, but it's alsosomething that we have inves ...

  3. Dev Express Report 学习总结(八)Dev Express Reports 常见问题总结

    1. 在新建ASP.NET Dev Express Report时的两种方式: A. 右键Add DevExpress Item->New Item->All->从Web Repor ...

  4. hdfs namenode/datanode工作机制

    一. namenode工作机制 1. 客户端上传文件时,namenode先检查有没有同名的文件,如果有,则直接返回错误信息.如果没有,则根据要上传文件的大小以及block的大小,算出需要分成几个blo ...

  5. linux在命令符界面如何浏览网页

    1.介绍 w3m是个开放源代码的命令行下面的网页浏览器. 它支持表格.框架.SSL连线.颜色.如果是在适当的terminal上,甚至还支持"inline image". 这个软件通 ...

  6. 关于python的sort和sorted

    1.sort无返回值,没有新建列表  例子: a=[2,1,3] print("a=",a) b=a.sort() print("a=",a) print(&q ...

  7. stringstream的使用

    stringstream是 C++ 提供的另一个字串型的串流(stream)物件,和之前学过的iostream.fstream有类似的操作方式.要使用stringstream, 必须先加入这一行: # ...

  8. [转]how can I change default errormessage for invalid price

    本文转自:http://forums.asp.net/t/1598262.aspx?how+can+I+change+default+errormessage+for+invalid+price I ...

  9. JAVA高并发秒杀API项目的学习笔记

    一步一步的搭建JAVA WEB项目,采用Maven构建,基于MYBatis+Spring+Spring MVC+Bootstrap技术的秒杀项目学习的视频:http://www.imooc.com/l ...

  10. 用 JS 做一个数独游戏(二)

    用 JS 做一个数独游戏(二) 在 上一篇博客 中,我们通过 Node 运行了我们的 JavaScript 代码,在控制台中打印出来生成好的数独终盘.为了让我们的数独游戏能有良好的体验,这篇博客将会为 ...