• STL — map(基础)


     map<string,int>和map<char *,int>有什么区别?部分转自: https://bbs.csdn.net/topics/270020481      

    map 排序部分 转自: https://www.cnblogs.com/eilearn/p/9473804.html

    摘自百度百科

    1,定义:Map是STL  的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,

    由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。

    2,这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,

    3,map的构造函数

    map<int,string> maphai;
    map<char,int> maphai;
    map<string,char> mapstring;
    map<string,int> mapstring;
    map<int,char>mapint;
    map<char,string>mapchar;    //  照我理解,这个应该是 前面 映射 后面
    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #include<vector>
    #include<map>
    using namespace std;
    int main(void)
    {
    	vector<char> a{ 'B', 'C' };
    	vector<char> b{ 'A', 'C', 'D' };
    	vector<char> c{ 'A', 'B', 'D','E' };
    	vector<char> d{ 'B', 'C', 'E','F' };
    	vector<char> e{ 'C', 'D' };
    	vector<char> f{ 'D' };
    	map <char, vector<char>> m
    	{
    		{ 'A',a },{ 'B',b },{ 'C',c },{ 'D',d },{ 'E',e },{ 'F',f }
    	};
    
    	system("pause");
    	return 0;
    }
    

      如上构造一个名叫 m 的 map ,其中使用 char 映射 vector char类型的 数组 

    4,数据的插入

    ①插入 pair 类型的数据

    map<int, char>m;
     m.insert((pair<int, char>(1, 'A')));

    当 map 已经存在某个值时,就无法再插入

    ②用数组方式插入数据

    map<char, int>m;
     m['A'] = 1;

    会覆盖重复的数据

    5,

    m.size()   大小

    m.count   返回的是被查找元素的个数。map中不存在相同元素,所以返回值只能是1或0。可以用这个知道有无出现,但不知道位置    出现为 1,不出现为 0

    m.find()    同 vector

    lower_bound   返回下界的迭代器

    upper_bound   返回上界的迭代器

    m.empty()

    m.clear()

    m.erase(1)   删除 1 ,成功返回 1 ,失败返回 0 

    6,当以char *做key时,stl中默认是以字符串为key还是以地址为key?

    我试时,看到是用地址。

    很明显的道理,不要简单从字面上的东西去理解,虽然char*可以指向字符串,但它毕竟只是一个指针,指针存放的内容只能是地址,请谨记。 
    而string是一个对象,当传递一个常量字符串(例如"abc")进来时,可以通过string的构造函数自动将该常量字符串转换为一个string对象。 
    如果把该常量字符串赋值给char*类型,就如同char* p = "abc"; 这个时候p只是一个指向"abc"的首地址的指针而已。

    7,map 的排序

    参数:map<key,value>  

    ① 按 key 升序:第三个参数 是用于函数比较的,没有的话默认 按 key 升序

    ② 按 key 降序:map<key,value,greater<key的类型> >  

    ③ 按 key 的长度排序,写一个比较函数

    struct CmpByKeyLength 
    {
        bool operator()(const string& k1, const string& k2)const 
        {
            return k1.length() < k2.length();
        }
    };

    ④:如果想要按照 value 升降序的话 需要将 map 移到 vector,在用 sort 排序

    #define _CRT_SECURE_NO__WARNINGS
    #include<iostream>
    #include<algorithm>
    #include<stdio.h>
    #include <vector>
    #include<string>
    #include<map>
    #include <functional>
    using namespace std;
    typedef  pair<string, int> P;
    bool cmp(const P& a, const P& b)
    {
        return a.second < b.second;
    }
    int main(void)
    {
        //1、map这里指定less作为其默认比较函数(对象),就是默认按键值升序排列
        map<string, int> m;
        m["LiMin"] = 90;
        m["ZiLinMi"] = 79;
        m["BoB"] = 92;
        m.insert(make_pair("Bing", 99));
        m.insert(make_pair("Albert", 86));
    
        //输出添加的内容
        map<string, int>::iterator iter;
        for (iter = m.begin(); iter !=m.end(); ++iter) {
            cout << (*iter).first << ' ' << (*iter).second << endl;
        }
        cout << endl;
    
        // 将map中的内容转存到vector中
        vector<P> v(m.begin(), m.end());
        //对线性的vector进行排序
        sort(v.begin(), v.end(), cmp);
    
        for (int i = 0; i < v.size(); ++i)
            cout << v[i].first <<' '<< v[i].second << endl;
    
        system("pause");
        return 0;
    }
    View Code

    ========= ========= ========= ====== ====== ===== ==== === == =

    锦瑟  李商隐 唐

    锦瑟无端五十弦,一弦一柱思华年。
    庄生晓梦迷蝴蝶,望帝春心托杜鹃。
    沧海月明珠有泪,蓝田日暖玉生烟。
    此情可待成追忆?只是当时已惘然。 
  • 相关阅读:
    SPOJ NSUBSTR
    一点对后缀自动机的理解 及模板
    HDU 1086 You can Solve a Geometry Problem too
    HDU2036 改革春风吹满地
    POJ 2318 TOYS
    [HNOI2008]玩具装箱TOY
    HDU 3507 Print Article
    洛谷 P1231 教辅的组成(网络最大流+拆点加源加汇)
    P3984 高兴的津津
    P2756 飞行员配对方案问题(网络流24题之一)
  • 原文地址:https://www.cnblogs.com/asdfknjhu/p/12430214.html
Copyright © 2020-2023  润新知