C++基础:C++标准库之map简介

1、综述

Map是C++STL中众多的Container(容器)之一,与python的字典略类似,Map作为一个关联容器,将key与value相互关联,其中key为关键字,是不可更改的,而value是key值的相对应值。Map所提供的一对一的数据映射关系,在很多时候可以提供编程的极大便利。

Map内部通过自建红黑树(一种非严格意义上的平衡二叉树)实现,可以对数据自动排序,因而在map内部的所有数据是有序存放的。Map具有的一大特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。

Map具有如下的功能特点:

  • 自动建立Key - value的对应。key 和 value可以是任意你需要的类型。

  • 根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。

  • 快速插入Key - Value 记录。

  • 快速删除记录

  • 根据Key 修改value记录。

  • 遍历所有记录。

2、map的常见操作

首先,在使用map之前需包含头文件#include<map>,下面简要介绍map的常见操作,详细信息可参见http://www.cplusplus.com/reference/map/map/

(1)构造函数:

map<int,string> Mymap;
map<int,string> Mymap2 (Mymap.begin(),Mymap.end());
map<int,string> Mymap3 (Mymap2);

示例中int是key的类型,string是value的类型,可以为其他类型,如map<char,float> Mymap4;

(2)插入数据:有几种方式,下面举三类例子。

Mymap[1] = "one"; //方式1
Mymap.insert(map<int,string>::value_type(11,"oneone"));//方式2
Mymap.insert(pair<int ,string>(111,"oneoneone"));//方式3

其中方式1简单直观,然而却并不值得提倡,因其性能并不好。在插入key =
1的value=“one”时,需要首先在Mymap,查找主键1是否已经存在,若不存在,则将一个新的对象插入Mymap,其key为1,但value是一个空字符串,插入完成后,将value赋为"one";
该方法会首先将每个值都赋为缺省值,然后再赋为显示的值,如果元素是类对象,则开销比较大。而另外的方法则有效避免了这一问题。

(3)查找元素:

利用find()方法,find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。


map<int ,string>::iterator itr;
itr = Mymap.find(1);
if(itr!=Mymap.end())//如找不到,返回Mymap.end()
{
cout<<"找到key为1的项:"<<endl;
cout<< itr->first <<" "<<itr->second<<endl;//可以打印该项的key和value
}
else
cout<<"找不到key为1的项!"<<endl;

(4)删除元素:

采用erase()方法实现:

itr = Mymap.find(1);
if(itr!=Mymap.end())
{
Mymap.erase(itr);//通过迭代器对象删除
//Mymap.erase(1);//也可以通过主键删除
}

erase()也可以删除一个范围如:

Mymap.erase(Mymap.begin(),Mymap.end());//相当于Mymap.clear(),可以清除整个map的内容

(5)swap()方法:

要注意的是,在map中swap()方法进行的是对于两个map的交换,而非对map内两个元素的交换。形如:

Mymap.swap(Mymap2);//交换两个map

(6)size()方法:

返回map的大小,即元素的个数。

(7)empty()方法

判断map是否为空,若map为空,则返回true。

(8)begin()方法:

返回指向map头部的迭代器

(9)end()方法:

返回指向map尾部的迭代器

(10)count() 方法:

返回指定元素出现的次数

3、常见操作程序实例

贴上一个简单的程序集运行结果,以便于更好的理解。


//测试map用法
#include<map>
#include<string>
#include<iostream>
using namespace std;

void test_map()
{
map<int ,string > Mymap;//key为int型,value为string型
map<int ,string > Mymap2;
pair<int ,string> Mypair;
Mypair.first = 1;
Mypair.second = "one";
Mymap.insert(Mypair);//添加数据方式1
Mymap.insert(map<int,string>::value_type(11,"oneone"));//添加数据方式二
Mymap2[2] = "two"; //添加数据方法三,效率较差,不提倡
Mymap2[22] = "twotwo";
Mymap2.insert(pair<int ,string>(222,"twotwotwo"));
map<int ,string>::iterator itr;//迭代器

cout<<"Mymap中的内容为:"<<endl;
for(itr = Mymap.begin();itr!=Mymap.end();itr++)//元素遍历
{
cout<< itr->first <<" " << itr->second<<endl;
}
cout<<"Mymap2中的内容为:"<<endl;
for(itr = Mymap2.begin();itr!=Mymap2.end();itr++)
{
cout<< itr->first <<" " << itr->second<<endl;
}

/////元素查找
itr = Mymap.find(11);//查找map中某key对应的元素是否存在
if(itr!=Mymap.end())//如找不到,返回Mymap.end()
{
cout<<"\n找到key为11的项:"<<endl;
cout<< itr->first <<" "<<itr->second<<endl;
itr->second = "oneoneone";
cout<<"该项value修改为:"<<Mymap[11]<<endl;
}

Mymap.swap(Mymap2);//注意:交换的是两个map
cout<<"\n执行交换后:"<<endl;
cout<<"Mymap中的内容为:"<<endl;
for(itr = Mymap.begin();itr!=Mymap.end();itr++)
{
cout<< itr->first <<" " << itr->second<<endl;
}
cout<<"Mymap2中的内容为:"<<endl;
for(itr = Mymap2.begin();itr!=Mymap2.end();itr++)
{
cout<< itr->first <<" " << itr->second<<endl;
}

cout<<"\n删除Mymap2中key为1的项"<<endl;
itr = Mymap2.find(1);
if(itr!=Mymap2.end())
{
Mymap2.erase(itr);//
//Mymap2.erase(1);//按key删除,以上面的操作效果等效
}
cout<<"删除后Mymap2中的内容为:"<<endl;
for(itr = Mymap2.begin();itr!=Mymap2.end();itr++)
{
cout<< itr->first <<" " << itr->second<<endl;
}
if(!Mymap.empty())
{
cout<<"\nMymap大小为:"<<Mymap.size()<<endl;
Mymap.clear();
//Mymap.erase(Mymap.begin(),Mymap.end());//与clear()等效
cout<<"clear()之后Mymap大小为:"<<Mymap.size()<<endl;
}
}

时间: 2025-01-01 11:39:07

C++基础:C++标准库之map简介的相关文章

C++基础:C++标准库之set简介

1.综述 set是C++STL中众多的Container(容器)之一,用于储存数据并且能从一个数据集合中取出数据,它的每个元素的值必须惟一.set内部通过自建红黑树(一种非严格意义上的平衡二叉树)实现,可以对数据自动排序.构造set集合主要目的是为了快速检索,不可直接去修改键值. 2.set的常见操作 首先,在使用map之前需包含头文件#include<set>,下面简要介绍map的常见操作,详细信息可参见http://www.cplusplus.com/reference/set/set/

STL标准库-容器-map和multimap

摘要: 摘要: 技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 map与multimap为关联容器,结构如下 map底层实现依然是rb_tree 他的data可以改,但是key不能改,因此map仍然具有自动排序的功能 我们无法使用迭代器改变元素的key(const key),但是可以改变元素的data. map的key必须独一无二,multimap的key可以重复 map的定义函数 template <typename _Key, typename _Tp, typena

C 标准库 - &lt;stdarg.h&gt;

C 标准库 - <stdarg.h> 简介 stdarg.h 头文件定义了一个变量类型 va_list 和三个宏,这三个宏可用于在参数个数未知(即参数个数可变)时获取函数中的参数. 可变参数的函数通在参数列表的末尾是使用省略号(,...)定义的. 库变量 下面是头文件 stdarg.h 中定义的变量类型: 序号 变量 & 描述 1 va_list 这是一个适用于 va_start().va_arg() 和 va_end() 这三个宏存储信息的类型. 库宏 下面是头文件 stdarg.h

C 标准库 - &lt;string.h&gt;

C 标准库 - <string.h> 简介 string .h 头文件定义了一个变量类型.一个宏和各种操作字符数组的函数. 库变量 下面是头文件 string.h 中定义的变量类型: 序号 变量 & 描述 1 size_t 这是无符号整数类型,它是 sizeof 关键字的结果. 库宏 下面是头文件 string.h 中定义的宏: 序号 宏 & 描述 1 NULL这个宏是一个空指针常量的值. 库函数 下面是头文件 string.h 中定义的函数: 序号 函数 & 描述 1

python基础教程_学习笔记14:标准库:一些最爱——re

标准库:一些最爱 re re模块包含对正则表达式的支持,因为曾经系统学习过正则表达式,所以基础内容略过,直接看python对于正则表达式的支持. 正则表达式的学习,见<Mastering Regular Expressions>(精通正则表达式) re模块的内容 最重要的一些函数 函数 描述 compile(pattern[,flags]) 根据包含正则表达式的字符串创建模式对象 search(pattern,string[,flags]) 在字符串中寻找模式 match(pattern,st

【c++】标准模板库STL入门简介与常见用法

一.STL简介 1.什么是STL STL(Standard Template Library)标准模板库,主要由容器.迭代器.算法.函数对象.内存分配器和适配器六大部分组成.STL已是标准C++的一部分,使用STL开发系统可以提高开发效率. 2.容器(Containers) 容器类是可以包含其它对象的模板类,如向量类(vector).链表类(list).双向队列类(deque).集合类(set)和映射类(map)等.其中vector.list.deque为序列式容器,set.map为关联式容器.

c++ 标准库的各种容器(vector,deque,map,set,unordered_map,unordered_set,list)的性能考虑

转自:http://blog.csdn.net/truexf/article/details/17303263 一.vector vector采用一段连续的内存来存储其元素,向vector添加元素的时候,如果容量不足,vector便会重新malloc一段更大的内存,然后把原内存中的数据memcpy到新的内存中,并free原内存块,然后将新元素加入.vector的元素插入性能跟以下几个要素关系重大: 1. 插入的位置 头部插入:将所有元素后移,然后将新元素插入 中间插入:将插入点后面的元素后移,然

python linecache标准库基础学习

#python标准库基础之:linecacge:高效读取文本文件#说明与作用"""可以从文件或者导入python模块获取文件,维护一个结果缓存,从而可以更高效地从相同文件读取多行文本;此模块会在python标准库的其他部分中用到,缓存实现将在内存中保存文件内容(解析为单独的行).API通过索引一个列表返回所请求的行.与反复地读取文件并解析文本来查找所需文本行相比,这样可以节省时间,这个方法在查找同一个文件中多行尤其有用 ,比如一个异常."""im

python calendar标准库基础学习

# -*- coding: utf-8 -*-# 作者:新手__author__ = 'Administrator'#标准库:日期时间基础学习:calendar:处理日期#例1import calendarc=calendar.TextCalendar(calendar.SUNDAY)c.prmonth(2015,3)#prmonth()简单函数,生成一个月的格式文件输出#TextCalendar()从星期天(为第一天,因为老外是从星期天开始算第一天的)#利用HTMLCalendar和forma