码迷,mamicode.com
首页 > 编程语言 > 详细

C++ Primer(第五版)学习笔记_8_标准模板库_map映照容器

时间:2015-07-15 15:09:21      阅读:127      评论:0      收藏:0      [点我收藏+]

标签:c++   stl   

C++ Primer(第五版)学习笔记_8_标准模板库_map映照容器

map映照容器的元素数据是由一个键值和一个映照数据组成的,键值与映照数据之间具有一一映照的关系。
map映照容器的数据结构也是采用红黑树来实现的。

1、map创建、元素插入和遍历访问

#include <iostream>
#include <stdio.h>
#include <vector>
#include <map>
#include <string>


using namespace std;


int main()
{
    map<string, float> str;
    //插入元素,按键值的由小到大放入红黑树中
    str["Jack"] = 98.5;
    str["Bomi"] = 96.0;
    str["Kate"] = 97.5;


    for(map<string, float>::iterator iter = str.begin(); iter != str.end(); iter++)
        cout << (*iter).first << " : " << (*iter).second << endl;


    return 0;
}

运行结果:
Bomi : 96
Jack : 98.5
Kate : 97.5


2、删除元素和重复插入值:erase()和clear()方法
(1)与set容器一样,map映照容器的erase()删除元素函数,可以删除某个键值上的所有元素。也可以使用clear()方法清空map映照容器。
(2)对于重复插入的值,只取最后插入的值
#include <iostream>
#include <stdio.h>
#include <vector>
#include <map>
#include <string>


using namespace std;


int main()
{
    map<int, char> str;
    //插入元素,按键值的由小到大放入红黑树中
    str[25] = 'm';
    str[28] = 'k';
    str[10] = 'x';
    str[30] = 'a';
    str[25] = 'i'; //重复插入的值,采用最后插入的值
    str[10] = 'y'; //重复插入的值,采用最后插入的值


    cout << "原始数据:" << endl;
    for(map<int, char>::iterator iter = str.begin(); iter != str.end(); iter++)
        cout << (*iter).first << " : " << (*iter).second << endl;


    //删除键值为0的元素
    int n = str.erase(0);
	cout << "删除元素个数:" << n << endl;


	//删除键值为25的元素
    n = str.erase(25);
	cout << "删除元素个数:" << n << endl;
    cout << "erase()后数据:" << endl;
    for(map<int, char>::iterator iter = str.begin(); iter != str.end(); iter++)
        cout << (*iter).first << " : " << (*iter).second << endl;


    str.clear();
    cout << "clear()后数据:" << endl;
    for(map<int, char>::iterator iter = str.begin(); iter != str.end(); iter++)
        cout << (*iter).first << " : " << (*iter).second << endl;
    return 0;
}

运行结果:
原始数据:
10 : y
25 : i
28 : k
30 : a 
删除元素个数:0
删除元素个数:1
erase()后数据:
10 : y
28 : k
30 : a 
clear()后数据:


3、元素反向遍历:reverse_iterator
需要rbegin()方法和rend方法指出反向遍历的起始位置和终止位置。
#include <iostream>
#include <stdio.h>
#include <vector>
#include <map>
#include <string>


using namespace std;


int main()
{
    map<int, char> str;
    //插入元素,按键值的由小到大放入红黑树中
    str[25] = 'm';
    str[28] = 'k';
    str[10] = 'x';
    str[30] = 'a';


    for(map<int, char>::reverse_iterator iter = str.rbegin(); iter != str.rend(); iter++)
        cout << (*iter).first << " : " << (*iter).second << endl;
    return 0;
}

运行结果:
30 : a 
28 : k
25 : m
10 : y


4、元素的搜索:find()
与set一样,使用find()方法搜索某个键值,搜索到了返回键值所在迭代器位置。否则,返回end()迭代器位置。由于采用红黑树结构,搜索速度是极快的。
#include <iostream>
#include <stdio.h>
#include <vector>
#include <map>
#include <string>


using namespace std;


int main()
{
    map<int, char> str;
    //插入元素,按键值的由小到大放入红黑树中
    str[25] = 'm';
    str[28] = 'k';
    str[10] = 'x';
    str[30] = 'a';


    map<int, char>::iterator iter;
    iter = str.find(28);
    if(iter != str.end())
        cout << (*iter).first << " : " << (*iter).second << endl;
    else
        cout << "not found it" << endl;
    return 0;
}

运行结果:
28 : k


5、自定义比较函数
默认情况下,按照键值由小到大的顺序插入元素。由于内部数据结构都是红黑树,因此编写比较函数与set是一致的。编写方法有两种,
(1)如果元素不是结构体,那么可以编写比较函数。下面实现键值由大道小的顺序将元素插入map中:
#include <iostream>
#include <stdio.h>
#include <vector>
#include <map>
#include <string>


using namespace std;


struct myComp
{
    bool operator()(const int& a, const int& b)
    {
         return a > b;
    }
};


int main()
{
    //插入元素,按键值的由大到小放入红黑树中
    map<int, char, myComp> str;


    str[25] = 'm';
    str[28] = 'k';
    str[10] = 'x';
    str[30] = 'a';


    for(map<int, char, myComp>::iterator iter = str.begin(); iter != str.end(); iter++)
        cout << (*iter).first << " : " << (*iter).second << endl;


    return 0;
}

运行结果:
运行结果:
30 : a 
28 : k
25 : m
10 : x


(2)如果元素是结构体,那么,可以直接把比较函数写在结构体里面。
#include <iostream>
#include <stdio.h>
#include <vector>
#include <map>
#include <string>


using namespace std;


struct Info
{
    string name;
    float score;
    //必须要写重载函数,重载"<"操作符,自定义排序规则
    bool operator < (Info a) const
    {
        //按score由大到小排列。如果要由小到大排列,使用">"号即可;
        return a.score < score;
    }
};


int main()
{
    //插入元素,按键值的由大到小放入红黑树中
    map<Info, int> str;
    Info info;


    info.name = "Jack";
    info.score = 60;
    str[info] = 25;
    info.name = "Bomi";
    info.score = 80;
    str[info] = 10;
    info.name = "Peti";
    info.score = 66.5;
    str[info] = 30;


    for(map<Info, int>::iterator iter = str.begin(); iter != str.end(); iter++)
    {
        cout << (*iter).second << " : ";
        cout << ((*iter).first).name << " " << ((*iter).first).score << endl;
    }
    return 0;
}
运行结果:
10 : Bomi 80
30 : Peti 66.5 
25 : Jack 60 


6、字符映照数字的map写法
对数字的各位进行分离,采用取余数的数学操作是很耗时的。而把数字当成字符串,使用map的映照功能,很方便地实现了数字分离。
#include <iostream>
#include <stdio.h>
#include <vector>
#include <map>
#include <string>


using namespace std;


int main()
{
    //插入元素,按键值的由大到小放入红黑树中
    map<char, int> str;
    str['0'] = 0;
    str['1'] = 1;
    str['2'] = 2;
    str['3'] = 3;
    str['4'] = 4;
    str['5'] = 5;
    str['6'] = 6;
    str['7'] = 7;
    str['8'] = 8;
    str['9'] = 9;
    /*
	//上面赋值语句可以用循环代码简化
    for(int j = 0; j < 10; j++)
        m['0' + j] = j;
    */
    string a;
    a = "6234";
    int sum = 0;
    for(int i = 0; i < a.length(); i++)
        sum += str[a[i]];
    cout << "各个数字的和为: " << sum << endl;


    sum = str[a[0]];
    for(int i = 1; i < a.length(); i++)
    {
        sum *= 10;
        sum += str[a[i]];
    }
    cout << "字符串转化为数字: " << sum << endl;
}

运行结果:
各个数字的和为:15
字符串转化为数字:6234


7、数字映照字符的map写法
#include <iostream>
#include <stdio.h>
#include <vector>
#include <map>
#include <string>


using namespace std;


int main()
{
    //插入元素,按键值的由大到小放入红黑树中
    map<int, char> str;
    str[0] = '0';
    str[1] = '1';
    str[2] = '2';
    str[3] = '3';
    str[4] = '4';
    str[5] = '5';
    str[6] = '6';
    str[7] = '7';
    str[8] = '8';
    str[9] = '9';


    /*
    //上面赋值语句可以用循环代码简化
    for(int j = 0; j < 10; j++)
        m[j] = '0' + j;
    */


    int n = 7;
    string single;
    cout << "单位数字转化为字符串: " << single + str[n] << endl;


    int num = 6234;
    string s;
    for(int i = num; i != 0; i /= 10)
    {
        s.insert(s.begin(), str[i % 10]);
    }
    cout << "多位数字转化为字符串: " << s << endl;


    return 0;
}

运行结果:
单位数字转化为字符串:7
多位数字转化为字符串:6234

版权声明:本文为博主原创文章,未经博主允许不得转载。

C++ Primer(第五版)学习笔记_8_标准模板库_map映照容器

标签:c++   stl   

原文地址:http://blog.csdn.net/keyyuanxin/article/details/46892333

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!