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;
} }

关于C++ STL标准库中map 的多元素应用的更多相关文章

  1. STL标准库中的容器

    容器:顾名思义,我的理解就是把同一种数据类型括起来,作为一捆.如vector<int> ,vector就是个容器,里面全是一个个的int型数据. 容器包括三大块: 顺序型容器: (1)ve ...

  2. 参考C++STL标准库中对了的使用方法

    http://www.cppblog.com/zhenglinbo/archive/2012/09/18/191170.html 参考:http://www.cppblog.com/zhenglinb ...

  3. STL标准库-容器-map和multimap

    技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 map与multimap为关联容器,结构如下 map底层实现依然是rb_tree 他的data可以改,但是key不能改,因此ma ...

  4. STL标准库-容器-set与map

    STL标准库-容器-set与multiset C++的set https://www.cnblogs.com/LearningTheLoad/p/7456024.html STL标准库-容器-map和 ...

  5. C++STL标准库学习笔记(五)set

    前言: 在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标记了出来,这一篇后面主要都是我的记录了,为了防止大片蓝色字体出现,后面就不改蓝色 ...

  6. STL笔记(6)标准库:标准库中的排序算法

    STL笔记(6)标准库:标准库中的排序算法 标准库:标准库中的排序算法The Standard Librarian: Sorting in the Standard Library Matthew A ...

  7. STL标准库-算法-常用算法

    技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 介绍11种STL标准库的算法,从这11种算法中总结一下算法的基本使用 1.accumulate() 累加 2.for_each( ...

  8. C++STL标准库学习笔记(三)multiset

    C++STL标准库学习笔记(三)multiset STL中的平衡二叉树数据结构 前言: 在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标 ...

  9. STL标准库-容器-set与multiset

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. set与multiset关联容器 结构如下 set是一种关联容器,key即value,value即key.它是自动排序,排序特点依据key se ...

随机推荐

  1. Android(java)学习笔记75:ListViewProject案例(ListView + BaseAdapter + CheckBox)

    这个案例可能稍微复杂一点,我会讲述详细一点: 1. 首先是AndroidManifest.xml: <?xml version="1.0" encoding="ut ...

  2. 倍增LCA

    前言 在做树上问题时,我们经常会遇到 \(LCA\)(最近公共祖先)问题.曾经的我遇到这类问题只会\(O(n)\)暴力求解,学了倍增\(LCA\),就可以\(O(logn)\)解决了. 简介 倍增\( ...

  3. PHP 的那些错误总结

    问题1: [root@web01 data]# lsof  -i :9000 [root@web01 data]# /application/php/sbin/php-fpm /application ...

  4. javaweb基础(28)_jstl的核心标签

    一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心 ...

  5. java算法面试题:写一个Singleton出来

    package com.swift; public class Singleton { public static void main(String[] args) { /* * 写一个Singlet ...

  6. Everything Be True-freecodecamp算法题目

    Everything Be True 1.要求 完善every函数,如果集合(collection)中的所有对象都存在对应的属性(pre),并且属性(pre)对应的值为真.函数返回ture.反之,返回 ...

  7. SummerVocation_Learning--java的自动打包与解包

    Auto Boxing: 自动将基础类型转换成对象(JDK1.5之后支持) Auto UnBoxing:自动将对象转换成基础类型 如 Map中的put方法,如果要传入键值对<a,1>,&l ...

  8. 1305: [CQOI2009]dance跳舞

    Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 4169  Solved: 1804[Submit][Status][Discuss] Descripti ...

  9. Zimber 8.8.12卸载后重新安装报错解决办法

    1.1  zimber故障处理步骤 1.1.1  现象描述 Running Post Installation Configuration: /opt/zimbra/bin/zmlocalconfig ...

  10. Linux清空mysql所有数据

    1,删除data目录下所有文件 rm -rf /usr/local/mysql5/data/* 2,mysql_install_db脚本初始化Mysql /usr/local/mysql5/scrip ...