//                        map使用
1 #include <iostream>
#include "insertVal.h"
#include "sort.h"
using namespace std; void main()
{
////////////三种插入方式////////////
InsertVal insert;
insert.insert_1();
cout<<"-------------------"<<endl;
insert.insert_2();
cout<<"-------------------"<<endl;
insert.insert_3();
cout<<"-------------------"<<endl;
/*以上三种用法,虽然都可以实现数据的插入,但是它们是有区别的,
当然了第一种和第二种在效果上是完全一样的,用insert函数插入数据,
在数据的插入上涉及到集合的唯一性这个概念,即当map中有这个关键字时,
insert操作是插入不了数据的,但是用数组方式就不同了,它可以覆盖以
前该关键字对应的值。*/ //////////map的大小//////////
map<int, int> iMap;
iMap[] = ;
iMap[] = ;
iMap[] = ;
cout<<iMap.size()<<endl; //////////map的遍历//////////
//
map<int, int>::reverse_iterator riter;
for(riter = iMap.rbegin(); riter != iMap.rend(); ++riter)//这里不要用后加,因为iterator是类模板,后加要返回一个无用的临时对象,
                                        //而it++是函数重载,所以编译器无法对其进行优化,所以每遍历一个元素,你就创建并销毁了一个无用的临时对象。
{
cout<<riter->first<<" "<<riter->second<<endl;
}
//
map<int, int>::iterator iter;
for(iter = iMap.begin(); iter != iMap.end(); ++iter)
{
cout<<iter->first<<" "<<iter->second<<endl;
}
//
map<string, int> sMap;
sMap["age"] = ;
sMap["height"] = ;
sMap["weight"] = ;
string str[] = {"age", "height", "weight"};
for (int i=; i<sMap.size(); i++)
{
auto val = sMap.at(str[i]);
cout<<str[i]<<":"<<val<<endl;
} //用count函数来判定关键字是否出现,结果返回1/0
cout<<sMap.count("age")<<endl; //用find函数来定位数据出现位置,它返回的一个迭代器,
//当数据出现时,它返回数据所在位置的迭代器,如果map
//中没有要查找的数据,它返回的迭代器等于end函数返回的迭代器
auto iters = sMap.find("age");
if(iters != sMap.end())
cout<<iters->first<<":"<<iters->second<<endl;
else
cout<<"no find!"<<endl; //Lower_bound函数用法,这个函数用来返回要查找关键字的下界(是一个迭代器)
//Upper_bound函数用法,这个函数用来返回要查找关键字的上界(是一个迭代器)
//例如:map中已经插入了1,2,3,4的话,如果lower_bound(2)的话,返回的2,
//而upper-bound(2)的话,返回的就是3
//Equal_range函数返回一个pair,pair里面第一个变量是Lower_bound返回的迭代器,
//pair里面第二个迭代器是Upper_bound返回的迭代器,如果这两个迭代器相等的话,
//则说明map中不出现这个关键字,
auto iter_1 = sMap.lower_bound("b");
auto iter_2 = sMap.upper_bound("b");
auto iter_pair = sMap.equal_range("ab"); /////////erase
sMap.erase("age");
sMap.erase(sMap.find("height"));
sMap.erase(sMap.begin(), --sMap.end());//删除一个区域是前闭后开的区间 /////////
if(sMap.empty())
sMap.clear(); sortShow();
return;
}

其中insertVal.h:

 #ifndef INSERTVAL_H
#define INSERTVAL_H #include <iostream>
#include <map>
#include <string>
using namespace std; class InsertVal
{
public:
void insert_1();
void insert_2();
void insert_3();
}; void InsertVal::insert_1()
{
map<int, string> mapStudent;
mapStudent.insert(pair<int, string>(, "Mical"));
mapStudent.insert(pair<int, string>(, "Meria"));
mapStudent.insert(pair<int, string>(, "Sam"));
map<int, string>::iterator iter;
for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
{
cout<<iter->first<<"号学生是:"<<iter->second<<endl;
}
} void InsertVal::insert_2()
{
map<int, string> mapStudent;
mapStudent.insert(map<int, string>::value_type (, "Mical"));
mapStudent.insert(map<int, string>::value_type (, "Meria"));
mapStudent.insert(map<int, string>::value_type (, "Sam"));
map<int, string>::iterator iter;
for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
{
cout<<iter->first<<"号学生是:"<<iter->second<<endl;
}
} void InsertVal::insert_3()
{
map<int, string> mapStudent;
mapStudent[] = "Mical";
mapStudent[] = "Meria";
mapStudent[] = "Sam";
map<int, string>::iterator iter;
for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
{
cout<<iter->first<<"号学生是:"<<iter->second<<endl;
}
} #endif

sort.h:

#ifndef SORT_H
#define SORT_H
#include <iostream>
#include <map>
#include <string>
using namespace std;
/*
map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的
STL中默认是采用小于号来排序,
在一些特殊情况,比如关键字是一个结构体,涉及到排序就会出现问题,
因为它没有小于号操作,insert等函数在编译的时候过不去
方法一:重载小于号。略
方法二:仿函数的应用,这个时候结构体中没有直接的小于号重载。如下
*/ typedef struct tagStudentInfo
{
int nID;
string strName;
}StudentInfo, *PStudentInfo; //学生信息 class sort
{
public:
bool operator() (StudentInfo const &_A, StudentInfo const &_B) const
{
if(_A.nID < _B.nID) return true;
if(_A.nID == _B.nID) return _A.strName.compare(_B.strName) < ;
return false;
}
}; void sortShow()
{
//用学生信息映射分数
map<StudentInfo, int, sort>mapStudent;
StudentInfo studentInfo;
studentInfo.nID = ;
studentInfo.strName = "student_one";
mapStudent.insert(pair<StudentInfo, int>(studentInfo, ));
studentInfo.nID = ;
studentInfo.strName = "student_two";
mapStudent.insert(pair<StudentInfo, int>(studentInfo, ));
} #endif

map使用的更多相关文章

  1. mapreduce中一个map多个输入路径

    package duogemap; import java.io.IOException; import java.util.ArrayList; import java.util.List; imp ...

  2. .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法

    .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...

  3. Java基础Map接口+Collections工具类

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  4. Java基础Map接口+Collections

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  5. 多用多学之Java中的Set,List,Map

            很长时间以来一直代码中用的比较多的数据列表主要是List,而且都是ArrayList,感觉有这个玩意就够了.ArrayList是用于实现动态数组的包装工具类,这样写代码的时候就可以拉进 ...

  6. Java版本:识别Json字符串并分隔成Map集合

    前言: 最近又看了点Java的知识,于是想着把CYQ.Data V5迁移到Java版本. 过程发现坑很多,理论上看大部分很相似,实践上代码写起来发现大部分都要重新思考方案. 遇到的C#转Java的一些 ...

  7. MapReduce剖析笔记之八: Map输出数据的处理类MapOutputBuffer分析

    在上一节我们分析了Child子进程启动,处理Map.Reduce任务的主要过程,但对于一些细节没有分析,这一节主要对MapOutputBuffer这个关键类进行分析. MapOutputBuffer顾 ...

  8. MapReduce剖析笔记之七:Child子进程处理Map和Reduce任务的主要流程

    在上一节我们分析了TaskTracker如何对JobTracker分配过来的任务进行初始化,并创建各类JVM启动所需的信息,最终创建JVM的整个过程,本节我们继续来看,JVM启动后,执行的是Child ...

  9. MapReduce剖析笔记之五:Map与Reduce任务分配过程

    在上一节分析了TaskTracker和JobTracker之间通过周期的心跳消息获取任务分配结果的过程.中间留了一个问题,就是任务到底是怎么分配的.任务的分配自然是由JobTracker做出来的,具体 ...

  10. MapReduce剖析笔记之三:Job的Map/Reduce Task初始化

    上一节分析了Job由JobClient提交到JobTracker的流程,利用RPC机制,JobTracker接收到Job ID和Job所在HDFS的目录,够早了JobInProgress对象,丢入队列 ...

随机推荐

  1. MySQL--增删改查分页存储过程以及事务

    添加和修改写在一起了 可以用id判断添加和修改 和事务在一起编码 可以让代码更严谨 在这里简单的说一下事务的四大特性 事务四大特性之原子性:原子性是指事务是一个不可再分割的工作单位,事务中的操作要么都 ...

  2. EMC VNX5200/5400存储 新增LUN与Hosts映射操作

    EMC VNX5200/5400 1.创建RAID  Groups 1.1        进入EMC VNX5200/5400主界面,依次选择Storage——Storage Pools——RAID ...

  3. 基于MATLAB的多功能语音处理器

    一.设计功能 录制音频,保存音频 对录制的语音信号进行频谱分析,确定该段语音的主要频率范围: 利用采样定理,对该段语音信号进行采样,观察不用采样频率(过采样.欠采样.临界采样)对信号的影响: 实现语音 ...

  4. python tkinter模块小工具界面

    代码 #-*-coding:utf-8-*- import os from tkinter import * root=Tk() root.title('小工具') #清空文本框内容 def clea ...

  5. Day5 练习

    1. 2. 要加强对代码效率的思考 3. 4. 知识点:1)多变量的同时赋值 2)元素的不可修改性:(1,2)=(3,4)与(a,b)= (b,a)     联想指针.地址去理解  :可用id()或t ...

  6. [luogu1640 SCOI2010]连续攻击游戏 (二分图最大匹配)

    传送门 Description lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某 ...

  7. 介绍一个不错的服务器综合监控工具脚本集aspersa

    http://blog.csdn.net/jackyrongvip/article/details/9217869

  8. javaScript面向对象继承方法经典实现

    转自原文javaScript面向对象继承方法经典实现 JavaScript的出现已经将近20多年了,但是对这个预言的褒贬还是众说纷纭.很多人都说JavaScript不能算是面向对象的变成语言.但是Ja ...

  9. HDU 4515

    刷水完毕,年月日,日日日日日日日日日日日日日日日日日日 #include <stdio.h> ,,,,,,,,,,,,}; ,M = ,D = ; int leap(int y) { == ...

  10. js左右切换 选择年龄

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...