C++ STL map的使用

1、map简介

map是一类关联式容器。它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。

2、map的功能

  1. 自动建立Key - value的对应。key 和 value可以是任意你需要的类型。
  2. 根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。
  3. 快速插入Key - Value 记录。
  4. 快速删除记录
  5. 根据Key 修改value记录。
  6. 遍历所有记录。

3、使用map

使用map得包含map类所在的头文件

#include <map> //注意,STL头文件没有扩展名.h

map对象是模板类,需要关键字和存储对象两个模板参数:

std:map<int, string> personnel;

这样就定义了一个用int作为索引,并拥有相关联的指向string的指针.

为了使用方便,可以对模板类进行一下类型定义,

typedef map<int, CString> UDT_MAP_INT_CSTRING;

UDT_MAP_INT_CSTRING enumMap;

4、在map中插入元素

改变map中的条目非常简单,因为map类已经对[]操作符进行了重载

enumMap[1] = "One";

enumMap[2] = "Two";

.....

这样非常直观,但存在一个性能的问题。插入2时,先在enumMap中查找主键为2的项,没发现,然后将一个新的对象插入enumMap,键是2,值是一个空字符串,插入完成后,将字符串赋为"Two"; 该方法会将每个值都赋为缺省值,然后再赋为显示的值,如果元素是类对象,则开销比较大。我们可以用以下方法来避免开销:

enumMap.insert(map<int, CString> :: value_type(2, "Two"))

5、查找并获取map中的元素

下标操作符给出了获得一个值的最简单方法:

CString tmp = enumMap[2];

但是,只有当map中有这个键的实例时才对,否则会自动插入一个实例,值为初始化值。

我们可以使用Find()和Count()方法来发现一个键是否存在。

查找map中是否包含某个关键字条目用find()方法,传入的参数是要查找的key,在这里需要提到的是begin()和end()两个成员,分别代表map对象中第一个条目和最后一个条目,这两个数据的类型是iterator.

int nFindKey = 2; //要查找的Key

//定义一个条目变量(实际是指针)

UDT_MAP_INT_CSTRING::iterator it= enumMap.find(nFindKey);

if(it == enumMap.end()) {

//没找到

}

else {

//找到

}

通过map对象的方法获取的iterator数据类型是一个std::pair对象,包括两个数据 iterator->first 和 iterator->second 分别代表关键字和存储的数据

6、从map中删除元素

移除某个map中某个条目用erase()

该成员方法的定义如下

  1. iterator erase(iterator it); //通过一个条目对象删除
  2. iterator erase(iterator first, iterator last); //删除一个范围
  3. size_type erase(const Key& key); //通过关键字删除

clear()就相当于 enumMap.erase(enumMap.begin(), enumMap.end());

C++ STL map的使用

以下是对C++中STL map的插入,查找,遍历及删除的例子:

#include <map>
#include <string>
#include <iostream>
using namespace std;

void map_insert(map < string, string > *mapStudent, string index, string x)
{
mapStudent->insert(map < string, string >::value_type(index, x));
}

int main(int argc, char **argv)
{
char tmp[32] = "";
map < string, string > mapS;

//insert element
map_insert(&mapS, "192.168.0.128", "xiong");
map_insert(&mapS, "192.168.200.3", "feng");
map_insert(&mapS, "192.168.200.33", "xiongfeng");

map < string, string >::iterator iter;

cout << "We Have Third Element:" << endl;
cout << "-----------------------------" << endl;

//find element
iter = mapS.find("192.168.0.33");
if (iter != mapS.end()) {
cout << "find the elememt" << endl;
cout << "It is:" << iter->second << endl;
} else {
cout << "not find the element" << endl;
}

//see element
for (iter = mapS.begin(); iter != mapS.end(); iter ) {

cout << "| " << iter->first << " | " << iter->
second << " |" << endl;

}
cout << "-----------------------------" << endl;

map_insert(&mapS, "192.168.30.23", "xf");

cout << "After We Insert One Element:" << endl;
cout << "-----------------------------" << endl;
for (iter = mapS.begin(); iter != mapS.end(); iter ) {

cout << "| " << iter->first << " | " << iter->
second << " |" << endl;

}

cout << "-----------------------------" << endl;

//delete element
iter = mapS.find("192.168.200.33");
if (iter != mapS.end()) {
cout << "find the element:" << iter->first << endl;
cout << "delete element:" << iter->first << endl;
cout << "=================================" << endl;
mapS.erase(iter);
} else {
cout << "not find the element" << endl;
}
for (iter = mapS.begin(); iter != mapS.end(); iter ) {

cout << "| " << iter->first << " | " << iter->
second << " |" << endl;

}
cout << "=================================" << endl;

return 0;
}

转载于:https://www.cnblogs.com/songQQ/archive/2010/01/24/1655473.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

bfs广度优先搜索算法_图的广度优先搜索(BFS)

bfs广度优先搜索算法What you will learn? 您将学到什么&#xff1f; How to implement Breath first search of a graph? 如何实现图的呼吸优先搜索&#xff1f; Breadth First Search is a level-wise vertex traversal process. Like a tree all the graphs have verte…

考研C++必刷题(一)

【程序1】 题目&#xff1a;有1、2、3、4个数字&#xff0c;能组成多少个互不相同且无重复数字的三位数&#xff1f;都是多少&#xff1f; 解题思路&#xff1a; 利用三层循环&#xff0c;分别控制百位十位个位&#xff0c;若百位十位个位有重复的&#xff0c;则不输出即可。 代…

关于计算机存储单位?

关于计算机存储单位&#xff1f; 计算机只能识别二进制。(1010100110. . . ) 1字节 8bit&#xff08;8比特&#xff09;–>1byte 8bit 1bit 就是一个 1 或 0 1KB 1024byte byte是[-128 ~ 127]&#xff0c;共可以标识256个不同的数字。 byte类型的最大值是怎么计算出来的…

ffmpeg 命令转封装

1&#xff1a; 改变编码格式 原mp4文件:视频是h264 音频是aac 视频转成h265&#xff0c;音频转成mp3&#xff08;容器为mkv&#xff0c;有些容器不一定支持放h265的&#xff09; ffmpeg -i test_60s.mp4 -vcodec libx265 -acodec libmp3lame out_h265_mp3.mkv 播放&#xff1a…

Delphi 2010 DataSnap封装COM对象

在Delphi 2010中,DataSnap已完全可以不使用COM了.想起在windows上配置COM,就麻烦的很,如果在本机还好说,在远程要涉及到权限等诸多问题(用SocketConnection要方便一些). 如果早期写的程序中有许多COM对象,我们可以通过DataSnap的封装,使用适配器模式简单地封装一下,那么在客户端…

JavaScript中带有示例的Math.PI属性

JavaScript | Math.PI属性 (JavaScript | Math.PI Property) Math.PI is a property in math library of JavaScript that is used to find the value of PI(π) which is a mathematical constant whose value is 3.141. It is generally used to solve problems related to c…

设计模式笔记——Bridge

桥接模式Bridge Pattern 组合关系&#xff08;实心菱形&#xff09;&#xff1a;强的拥有关系&#xff0c;体现了严格的整体和部分的关系&#xff0c;部分和整体的生命周期相同。 聚合关系&#xff08;空心菱形&#xff09;&#xff1a;弱的拥有关系&#xff0c;A对象可以包含B…

实验7 视图操作

实验7 视图操作一、实验目的 1.了解视图的功能。 2.掌握创建和查看视图的方法。 3.掌握视图修改和删除视图的方法。 二、实验要求 创建student数据库中的相关视图。 三、实验步骤 1.在members表中创建地址为“湖南株洲”的会员的视图V_addr&#xff0c;SQL代码如下所示&#x…

从日志服务器接收的对 metaWeblog.newPost 方法的响应无效的解决方案

今天用windows Live Writer(WLW)写博客出现了“从日志服务器接收的对 metaWeblog.newPost 方法的响应无效”的故障。之前用的还好好的。于是我祭起google大法。从网上搜索了不少资料都是关于WP&#xff0c;没有关于z-blog。这些文章提到可能的问题是诸如插件冲突、utf编码之类的…

汇编语言-006(数组操作 、字符串应用、PUSHFD_POPFD 、PUSHAD_POPAD 、 子程序 函数、 USES 、 INC_DEC )

1: 计算斐波那契数列前7个数值之和 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data.code main PROCmov esi,1mov edi,1mov eax,2mov ecx,5 L1: mov ebx,esiadd ebx,edimov esi,edimov edi,ebxadd eax,ebxloop L1INVOKE ExitProcess,0 main END…

弗林的计算机体系结构分类

计算机体系结构分类 (Classification of computer architecture) According to Flynns there are four different classification of computer architecture, 根据弗林的说法&#xff0c;计算机体系结构有四种不同的分类&#xff0c; 1)SISD(单指令单数据流) (1) SISD (Single…

读入txt

用C#读取txt文件的方法1、使用FileStream读写文件 文件头&#xff1a; using System;using System.Collections.Generic;using System.Text;using System.IO; 读文件核心代码&#xff1a; byte[] byData new byte[100];char[] charData new char[1000]; try{FileStream sFile…

实验6 数据查询--高级查询

实验6 数据查询--高级查询一、实验目的 1.掌握查询结果排序的方法。 2.掌握排序结果进行计算的方法。 3.掌握排序结果分组的方法。 4.掌握排序结果分组后再选择的方法。 二、实验要求 应用SELECT语句对数据库eshop中数据进行指定条件的高级查询。 三、实验步骤 1.查询性别为“…

Python程序可打印今天的年,月和日

In the below example – we are implementing a python program to print the current/ todays year, month and year. 在下面的示例中-我们正在实现一个python程序来打印当前/今天的年&#xff0c;月和年 。 Steps: 脚步&#xff1a; Import the date class from datetime …

工资年结时提示“上年数据已经结转”

解决方案&#xff1a;执行如下SQL语句即可解决&#xff1a;use ufsystem update ua_account_sub set bclosing0 where cacc_id001 and iyear2005 and csub_idwa 重新年结即可 问题分析&#xff1a;产生问题的原因是用户进行过工资的年结&#xff0c;在业务数据需要调整&…

汇编语言-007(ADD_SUB_NEG 、 PUSH和POP指令应用 、 AND,OR,XOR使用 、 条件跳转应用)

1&#xff1a; ADD_SUB_NEG : ADD伪指令增加数值&#xff0c;SUB伪指令减少数值,NEG取反1 .386 .model flat,stdcall.stack 4096 ExitProcess PROTO,dwExitCode:DWORD.data var1 DWORD 10000h var2 DWORD 20000h.code main PROCmov eax,var1add eax,var2mov eax,var2sub eax,v…

Automatic Reference Counting

Automatic Reference Counting http://clang.llvm.org/docs/AutomaticReferenceCounting.html转载于:https://www.cnblogs.com/StarMud/articles/2642263.html

实验5 数据查询--连接查询

实验5 数据查询--连接查询一、实验目的 1.熟悉等值联接查询的方法。 2.熟悉非等值联接查询的方法。 3.熟悉自身联接查询的方法。 4.熟悉外联接查询的方法。 5.熟悉复合条件联接的方法。 二、实验要求 应用SELECT语句对数据库eshop中数据进行指定条件的连接查询。 三、实验步骤…

Java RandomAccessFile readInt()方法与示例

RandomAccessFile类readInt()方法 (RandomAccessFile Class readInt() method) readInt() method is available in java.io package. readInt()方法在java.io包中可用。 readInt() method is used to read signed 32-bit integer value from this RandomAccessFile. readInt()方…

天高地厚(转)

信乐团-天高地厚作词:武雄作曲:詹凌驾 keith stuart你累了没有可否伸出双手想拥抱怎能握着拳头我们还有很多梦没做还有很多明天要走要让世界听见我们的歌准备好没有时间不再回头想要飞不必任何理由不管世界尽头多寂寞你的身边一定有我我们说过不管天高地厚想飞到那最高最远最洒…