关于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;
    }
    
}
posted @ 2017-11-15 21:14  天师符  阅读(876)  评论(0编辑  收藏  举报