zoukankan      html  css  js  c++  java
  • 关于C++ STL标准库中map 的多元素应用

    map的特性是,所有的元素会根据键值自动排序。map的所有元素都是pair,同时拥有实值(value)和键值(key)。pair的第一个元素被视为键值,第二个被视为实质
    piar 的定义

    template<class T1,class T2>
    struct pair{
     typedef T1 first_type;
     typedef T2 second_type;
    
    T1 first; //为public
    T2 second;//为public
    
    pair():first(T1()),second(T2()){}
    pair(const T1&a,const T2&b):first(a),second(b){}
    };
    

    注意:
    1.使用map不能修改元素的key,这会影响map元素的排列规则,会破坏map组织
    2.可以修改元素的value
    3.标准的STL的map以RB-tree为底层机制,由于map所开放的各种操作接口,所以几乎map操作行为都是97影院调用RB-tree的操作行为

    map的源码

    template<class key,class T,class Copmpare=less<key>,class Alloc=alloc>
    class map{
    public:
    typedef key key_type;
    typedef T data_type;
    typedef T mapped_type;
    typedef pair<const Key,T>value_type;
    typedef Compare key_compare;
    /*以下是定义的仿函数,用于比较排序
     class value_compare
      :public binary_function<value_type,value_type,bool>
     {
    firend class map<Key,T,Compare,Alloc>;//与map友元
      protect:www.97yingyuan.org
      compare comp;
      value_compare(Compare c):comp(c){}
      public:
      bool operator(const value& x,const value_type&y)const
        {
        return comp(x.first ,y.first);
        }
     }
    private:
    /*以下定义表述型别。以map元素型别(一个pair)的第一型别,作为RB-tree节点的键值型别
     typedef rb_tree<key_type,value_type,          select<value_type>,key_compare,Alloc>rep_type;
     rep_type t;
    public:
    typedef typename......  //类型名的重命名
    map():t(Compare()) {}.........//map的构造以及map的各种操作
    }
    

    从map中的源码首先可看出
    1.map和RB-tree的关系
    2.map中以pair为第一型别又被typedef为value_type
    3.比较时用到了仿函数友元函数
    以下是测试程序,经过思考pair是结构体,我们也可以输入结构体达到>=2参数的输入以及使用
    //

     
        #include "stdafx.h"
        #include <iostream>
        #include <string>
        #include <map>
        #include <algorithm>
    
    using namespace std;
    struct  person
    {
        string name;
        double sore;
    };
    int main()
    {
        map<int, person>x;
        x.insert(map<int, person>::value_type(1,{"zyh",100}));
        x.insert(map<int, person>::value_type(3, { "zlw",10 }));
        x.insert(map<int, person>::value_type(2, { "hyf",1 }));
        x.insert(map<int, person>::value_type(4, { "slj",3 }));
        
        
        pair<int, person>value(5,{ "srx",234 });//另外一种插入方式
        x.insert(value);
        
        map<int, person>::iterator it = x.begin();//使用迭代器输出
        for (; it != x.end(); it++)
        {
            cout << it->first << ' ' ;
            cout << it->second.name << ' ';
            cout << it->second.sore << endl;
        }
        
    }
  • 相关阅读:
    使用非root用户在RedHat 4下安装XHProf
    使用ClippingNode对精灵进行遮罩处理
    令Code::Blocks支持C++11特性
    解决cocos2dx在VS2012中文版环境下不支持中文的问题
    bzoj 1045[HAOI2008] 糖果传递
    bzoj 1070[SCOI2007]修车
    bzoj [ZJOI2010]网络扩容
    bzoj 1089[SCOI2003]严格n元树
    bzoj 4566[Haoi2016]找相同字符
    bzoj 1085[SCOI2005]骑士精神
  • 原文地址:https://www.cnblogs.com/tianshifu/p/7840997.html
Copyright © 2011-2022 走看看