map--C++ STL 学习
map–C++ STL 学习
Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力。
说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的。
map是使用红黑树实现的,访问、查找和删除操作的复杂度都是O(logn)。
template<
class Key, //键
class T, //值
class Compare = std::less<Key>, //
class Allocator = std::allocator<std::pair<const Key, T>
> class map;
(1)map的创建
map共提供了6个构造函数,这块涉及到内存分配器这些东西,略过不表,在下面我们将接触到一些map的构造方法,这里要说下的就是,我们通常用如下方法构造一个map:
Map<int, string> mapStudent;
(2)遍历操作
遍历map无疑就需要使用到迭代器,下面列出了四种map迭代器
iterator begin(); //返回指向起始元素的迭代器
iterator rbegin(); //返回指向末尾元素的迭代器
iterator end(); //返回指向末尾元素的后一个的迭代器
iterator rend(); //返回指向起始元素的前一个的迭代器
(3)插入操作
1.使用[]插入
直接使用[]插入,如果mymap中不存在键值为”abc”元素,那么就执行插入操作。
mymap["abc"] = 1;
2.插入单个元素
//函数原型:
std::pair<iterator,bool> insert( const value_type& value ); //这里的返回值:bool表示插入是否成功、iterator返回插入的位置
//操作示例:
mymap.insert( map<int, string>::value_type(1, "one") );
3.插入多个元素
//函数原型:
template< class InputIt >
void insert( InputIt first, InputIt last );
//操作示例:
map<int, string> tmp = {
{5, "five"},
{6, "six"}
};
mymap.insert( tmp.begin(),tmp.end() );
4. 使用std::initializer_list插入
C++11中新加入的插入数据方式:
//函数原型:
void insert( std::initializer_list<value_type> ilist );
//操作示例:
mymap.insert( { {7, "seven"}, {8, "eight"}, {9, "nine"} } );
(4)删除操作
1. 删除指定位置的元素
//函数原型:
iterator erase( iterator pos );
//具体示例:
std::map<std::string,int>::iterator it = mymap.erase(mymap.begin()); //返回删除元素的下一个元素的迭代器
2. 删除指定范围的元素
//函数原型:
iterator erase( const_iterator first, const_iterator last );
//具体示例:
mymap.erase(mymap.begin(), mymap.end()); //删除所有的元素
3. 依据键值删除元素
//函数原型:
size_type erase( const key_type& key );
//具体示例:
int num = mymap.erase("abc");
PS:方法一和方法二的返回值都是删除元素的下一个元素的迭代器,在C++11之前他们都是没有返回值的。方法三的返回值是删除元素的数目。
(5)max_size(),最大容纳量;size(),当前的元素个数
cout << "map中的最大容量为:" << map1.max_size() << endl;
cout << "map中的元素个数为:" << map1.size() << endl;
(6)empty(),判断map是否为空
cout << "map是否为空:" << map1.empty() << endl;
如果为空,返回1.否则返回0。
(7)swap():交换两个map中的值。
(8)[],at(),取某位置的元素值
// 取map中某位置的元素值
cout << "在1位置的元素值为:" << map1.at(1) << endl;
cout << "在1位置的元素值为:" << map1[1] << endl;
(9)[],at():修改元素
// 修改map中的某个值
map1[2] = 99;
map1.at(3) = 88;
(10)clear():清除所有元素
// 清除所有数据
map1.clear();
cout << "map是否为空:" << map1.empty() << endl;
执行以后就是一个空的map,不包含任何元素。
其他方法
size_type count( const Key& key ) const; //返回关键字为key的元素的个数,在map里结果不是0就是1
iterator find( const Key& key ); //返回key所在位置的迭代器,如果没有找到则返回end()
关于map的更详细介绍可以参考文档:http://en.cppreference.com/w/cpp/container/map
map--C++ STL 学习的更多相关文章
- STL学习:STL库vector、string、set、map用法
本文仅介绍了如何使用它们常用的方法. vector 1.可随机访问,可在尾部插入元素:2.内存自动管理:3.头文件#include <vector> 1.创建vector对象 一维: (1 ...
- 侯捷STL学习(九)--关联式容器(Rb_tree,set,map)
layout: post title: 侯捷STL学习(九) date: 2017-07-21 tag: 侯捷STL --- 第十九节 容器rb_tree Red-Black tree是自平衡二叉搜索 ...
- 侯捷STL学习(十)--容器hashtable探索(unordered set/map)
layout: post title: 侯捷STL学习(十) date: 2017-07-23 tag: 侯捷STL --- 第二十三节 容器hashtable探索 hashtable冲突(碰撞)处理 ...
- 标准模板库(STL)学习指南之map映射
转载自CSDN博客:http://blog.csdn.net/bat603/article/details/1456141 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关 ...
- 标准模板库(STL)学习探究之stack
标准模板库(STL)学习探究之stack queue priority_queue list map/multimap dequeue string
- ###STL学习--vector
点击查看Evernote原文. #@author: gr #@date: 2014-08-11 #@email: forgerui@gmail.com vector的相关问题.<stl学习> ...
- ###STL学习--关联容器
点击查看Evernote原文. #@author: gr #@date: 2014-08-23 #@email: forgerui@gmail.com STL中的关联容器. ###stl学习 |--迭 ...
- ###STL学习--迭代器
点击查看Evernote原文. #@author: gr #@date: 2014-08-23 #@email: forgerui@gmail.com STL中的迭代器. ###stl学习 |--迭代 ...
- ###STL学习--函数对象
点击查看Evernote原文. #@author: gr #@date: 2014-08-13 #@email: forgerui@gmail.com 在stl中,函数对象被大量地使用,用以提高代码的 ...
随机推荐
- 协同过滤中的Grey Sheep问题
寒神解释:某些用户的倾向性和品味没有一致性,比较散.因此在协同过滤这种算法里,没办法和某个group有很高的相似/一致度,推荐会失效. 我理解是寻找邻居时候计算得到的相似度和其他用户相似度都非常小,或 ...
- REST和SOAP区别
转载于: http://blog.csdn.net/idafish/article/details/6308916 REST似乎在一夜间兴起了,这可能引起一些争议,反对者可以说REST是WEB诞生之 ...
- 【Git】GitHub for Windows使用(1)
目录 1.下载GitHub for windows 客户端 2.注册GitHub 3.启动windows端客户端,登录帐号 4.了解Git客户端,从而了解Git的大体功能 5.创建一个新的资源库 6 ...
- fastjson用法&Gson
<dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson&l ...
- fl2440 platform总线led字符设备驱动
首先需要知道的是,设备跟驱动是分开的.设备通过struct device来定义,也可以自己将结构体封装到自己定义的device结构体中: 例如:struct platform_device: 在inc ...
- Spark(十) -- Spark Streaming API编程
本文测试的Spark版本是1.3.1 Spark Streaming编程模型: 第一步: 需要一个StreamingContext对象,该对象是Spark Streaming操作的入口 ,而构建一个S ...
- flume分布式日志收集系统操作
1.flume是分布式的日志收集系统,把收集来的数据传送到目的地去. 2.flume里面有个核心概念,叫做agent.agent是一个java进程,运行在日志收集节点. 3.agent里面包含3个核心 ...
- perl学习笔记——文件测试
文件测试主要用于查看如文件是否存在.文件大小.文件更新时间等信息. 文件测试操作符 -e 测试文件是否存在: die "Oops!A file called '$filename' alr ...
- POJ Cow Exhibition
题目链接:Click Here~ 题目意思自己看吧. 算法分析: 对我来想是没有想到,最后看别人的博客才知道的.要把当中的一个条件当作体积.由于两个条件都存在负数,所以还要先保证最后不会再体积中出现负 ...
- linux 终端分屏命令vsp(转)
比如:某文件夹下有文件:vector.cc, substr.cc 1.使用vim命令打开任意一个文件:vim vector.cc打开第一个文件.如下图所示: 2.按:"Esc"键 ...