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对象,丢入队列 ...
随机推荐
- (2)dotnet开源电商系统-brnshop VS nopCommerce(dotnet两套电商来PK--第二篇:代码从哪开始-BrnMall3.0Beta)
看大牛们的源码,对于水平一般的人,还是略微有点难度的.我从我自身读码的亲身体验,写下杂散片语,希望能和大家一同进步,也为了日后记忆上的备查. 先看的是brnMall的源码结构,从哪看起呢? 首先推荐看 ...
- vue 登录验证码
vue 登录验证码 最近在开发pc端项目,配合elementui使用 createCode() { var code = ""; var codeLength = 4; //验证码 ...
- /proc目录介绍
1. /proc目录 Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以 ...
- Wireshark 如何捕获网络流量数据包
转自:http://www.4hou.com/web/7465.html?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutia ...
- 为什么多 TCP 连接比单 TCP 连接传输快
转自: 我观察到,客户端机器从单一服务器使用 HTTP 下载一个文件:1. 单连接下载,速度没有达到客户端网络的最大带宽:2. 多连接同时下载,传输速度有极大的提高,带宽被占满. 假设如下前提:1. ...
- nyoj23-取石子(一)
取石子(一) 时间限制:3000 ms | 内存限制:65535 KB 难度:2 描述 一天,TT在寝室闲着无聊,和同寝的人玩起了取石子游戏,而由于条件有限,他/她们是用旺仔小馒头当作石子.游戏的 ...
- 在LinuxMint19上安装搜狗拼音输入法
写在前面 由于Linux mint是基于Ubuntu的深度改造,所以按照网上针对Ubuntu的安装方法基本都是有用的.LinuxMint自身就携带了IBUS和fcitx两个框架.然而并非每次都能正常使 ...
- 2.1 SVN的安装
一.SVN客户端安装 运行TortoiseSVN-1.6.6.17493-win32-svn-1.6.6.msi程序, 开始安装 点击Next, 下一步 选择 I accept 接受, 点击Next ...
- react 点击事件+父子传值
接下来要做的效果是,在父组件添加两个按钮,点击后改变父组件传过去的值 父组件 import React, { Component } from 'react'; import Test from '. ...
- 阿里云 LAMP 使用基础
产品亮点 1.基于阿里云CentOS7.2镜像 2.采用yum方式安装,软件安装均为默认目录,未作任何修改. 3.采用经典LAMP组合,拓展性强,资源丰富,解决方案较多 4.附带PhpMyadmin和 ...