map使用
// 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使用的更多相关文章
- mapreduce中一个map多个输入路径
package duogemap; import java.io.IOException; import java.util.ArrayList; import java.util.List; imp ...
- .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法
.NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...
- Java基础Map接口+Collections工具类
1.Map中我们主要讲两个接口 HashMap 与 LinkedHashMap (1)其中LinkedHashMap是有序的 怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...
- Java基础Map接口+Collections
1.Map中我们主要讲两个接口 HashMap 与 LinkedHashMap (1)其中LinkedHashMap是有序的 怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...
- 多用多学之Java中的Set,List,Map
很长时间以来一直代码中用的比较多的数据列表主要是List,而且都是ArrayList,感觉有这个玩意就够了.ArrayList是用于实现动态数组的包装工具类,这样写代码的时候就可以拉进 ...
- Java版本:识别Json字符串并分隔成Map集合
前言: 最近又看了点Java的知识,于是想着把CYQ.Data V5迁移到Java版本. 过程发现坑很多,理论上看大部分很相似,实践上代码写起来发现大部分都要重新思考方案. 遇到的C#转Java的一些 ...
- MapReduce剖析笔记之八: Map输出数据的处理类MapOutputBuffer分析
在上一节我们分析了Child子进程启动,处理Map.Reduce任务的主要过程,但对于一些细节没有分析,这一节主要对MapOutputBuffer这个关键类进行分析. MapOutputBuffer顾 ...
- MapReduce剖析笔记之七:Child子进程处理Map和Reduce任务的主要流程
在上一节我们分析了TaskTracker如何对JobTracker分配过来的任务进行初始化,并创建各类JVM启动所需的信息,最终创建JVM的整个过程,本节我们继续来看,JVM启动后,执行的是Child ...
- MapReduce剖析笔记之五:Map与Reduce任务分配过程
在上一节分析了TaskTracker和JobTracker之间通过周期的心跳消息获取任务分配结果的过程.中间留了一个问题,就是任务到底是怎么分配的.任务的分配自然是由JobTracker做出来的,具体 ...
- MapReduce剖析笔记之三:Job的Map/Reduce Task初始化
上一节分析了Job由JobClient提交到JobTracker的流程,利用RPC机制,JobTracker接收到Job ID和Job所在HDFS的目录,够早了JobInProgress对象,丢入队列 ...
随机推荐
- C#遍历/反射 属性/字段
public static string SortParam<T>(T t) { string tStr = string.Empty; if (t == null) { return s ...
- HDU_1517_博弈(巧妙规律)
A Multiplication Game Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...
- google浏览器 打印A4 最大宽度和高度px
width: 1563px;(max) + = 分页了 + = 分页了 + = 没有分页 / ViewBag.results[].Count)); <td width="15%&quo ...
- vue中需要注意的问题总结(上)
React 与其说是一种框架,倒不如说是一种开发范式.它的核心理念非常简单: 界面/视图就是数据结构的可视化表达UI = f(data) 而界面/视图由组件组合而来UI = f1(data) + f2 ...
- MessageFormat.format()用法
1.java.text.Format的继承结构如下 2.MessageFormat模式 FormatElement { ArgumentIndex }:是从0开始的入参位置索引 { Argumen ...
- Java 并行 (2): Monitor
转自:http://www.cnblogs.com/tomsheep/archive/2010/06/09/1754419.html 1. 什么是Monitor? Monitor其实是一种同步工具,也 ...
- 洛谷P1090 合并果子【贪心】
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看出,所 ...
- VS2015 C++ 获取 Edit Control 控件的文本内容,以及把获取到的CString类型的内容转换为 int 型
UpdateData(true); //读取编辑框内容,只要建立好控件变量后调用这个函数使能,系统就会自动把内容存在变量里 //这里我给 Edit Control 控件创建了一个CString类型.V ...
- C# 实现串口发送数据(不用串口控件版)
参考:https://blog.csdn.net/mannix_lei/article/details/79979432 https://www.cnblogs.com/ElijahZeng/p/76 ...
- SCU - 4110 - PE class
先上题目: 4110: PE class Submit your solution Discuss this problem Best solutions Description ...