c++的关联容器入门(map and set)
C++的关联容器主要是两大类map和set
我们知道谈到C++容器时,我们会说到 顺序容器(Sequence containers),关联容器(Associative containers),无序关联容器(Unordered associative containers)以及容器适配器(Container adaptors),
另外,我相信,这些抽象的容器概念,应该是所有高级语言都有的。本文重点阐述关联容器。
Associative containers implement sorted data structures that can be quickly searched (O(log n) complexity).
关联容器实现了可以快速搜索(O(log n)复杂度)的排序数据结构。
主要就是 set、map、multiset和multimap。
std::map
map is a sorted associative container that contains key-value pairs with unique keys. Keys are sorted by using the comparison function Compare. Search, removal, and insertion operations have logarithmic complexity. Maps are usually implemented as red-black trees。
map是一个排序的关联容器,它包含具有惟一键的键值对。通过使用Compare函数对键进行排序。搜索、删除和插入操作具有对数复杂度。映射通常被实现为红黑树
理解map需要理解键值对、有序、键值唯一以及对数级别的操作。
键值对
既然是关联容器,那自然要关联下,这里的关联就是key和value的关联,通过
std::map<string,string> mapStr;这样,我们就定义了一个key为string ,value为string的map。我们可以通过中括号直接给键值对赋值:mapStr["name"] = "lckfa";
mapStr["sexuality"] = "male";
事实上,map的底层是使用pair来实现的,std::pair是一个结构模板,它提供了一种将两个异构对象存储为单个单元的方法。因此还可以使用如下代码完成上面的操作:
pair<string,string> pair1("name","lckfa");
pair<string,string> pair2("sexuality","male");
mapStr.insert(pair1);
mapStr.insert(pair2);
有序
为了看看map是怎么有序的,我们先弄个打印函数出来
template<typename Map>
void print_map(Map& m){
std::cout << "{ " ;
for_each(m.begin(),m.end(),[&](Map::value_type& p){
std::cout << p.first <<":"<<p.second<<' ';
});
std::cout << "}" ;
}
这个打印函数模板,可以打印任何类型的map。这下再也不担心map的类型改变了。还不会使用labmda表达式的,可以去看我的另一篇博文,另外value_type可以理解为pair,这里和Map是一个类型。
然后,我们在之前的map里新增一个键值对
mapStr["sss"] = "sss";
mapStr["aaa"] = "aaa";
mapStr["bbv"] = "bbb";
使用pair,然后insert也行。
然后调用
print_map函数,结果如下:{ aaa:aaa bbv:bbb name:lckfa sexuality:male sss:sss }
以上结果充分说明 map是按key的升序排列的。
备注,如果你想自定义map的排序方式,可以参考这里
键值唯一
白话就是,这里的key值总是唯一的,那么让我们来验证下,同时向map里插入相同键值会发生什么:
mapStr["name"] = "lckfa";
mapStr["sexuality"] = "male";
mapStr["name"] = "mal9";
打印结果:
{ name:mal9 sexuality:male }
从结果可知,再重新设置某个key的value后,后一个会覆盖前一个value。
对数级别的复杂度操作
这个就不展开了,有兴趣的可以了解一个红黑树。
std::set
std::set is an associative container that contains a sorted set of unique objects of type Key. Sorting is done using the key comparison function Compare. Search, removal, and insertion operations have logarithmic complexity. Sets are usually implemented as red-black trees
set是一个关联容器,它包含一组类型为Key的已排序的惟一对象。排序是使用key的比较函数比较来完成的。搜索、删除和插入操作具有对数复杂度。集合通常被实现为红黑树。
和map一样,除了map的键值对差异,set只有key,这样的差异外,set和map再定义和使用上没有很大的差异。同样的set也具有 key唯一,有序,对数复杂度的特点,这里使用一个统一的代码说明下:
template<typename Set>
void print_set(Set& s){
	cout << "{ ";
	for_each(s.begin(),s.end(),[&](Set::key_type k){
		std::cout << k <<' ';
	});
	std::cout << "}" ;
}
std::set<int> setInt;
setInt.insert(4);
setInt.insert(2);
setInt.insert(5);
setInt.insert(2);
std::set<string> setStr;
setStr.insert("hello");
setStr.insert("set");
setStr.insert("world");
setStr.insert("set");
print_set(setInt);
print_set(setStr);
测试输出结果:
{ 2 4 5 }{ hello set world }
由结果可知:set的key值也是唯一的,同时按升序排列,如果希望自定义排列,需要需改比较函数。
小结:本文初略的整理了map和set的基础使用,说明了二者的特性,key唯一,有序,算法对数级。仅仅能作为初学者参考。
c++的关联容器入门(map and set)的更多相关文章
- STL的基本使用之关联容器:map和multiMap的基本使用
		
STL的基本使用之关联容器:map和multiMap的基本使用 简介 map 和 multimap 内部也都是使用红黑树来实现,他们存储的是键值对,并且会自动将元素的key进行排序.两者不同在于map ...
 - 【STL容器学习】-关联容器与map的用法
		
STL提供了4个关联容器:set.multiset.map和multimap.这些容器提供了通过keyword高速存储和訪问数据元素的能力.Set和map不同意有反复keyword,而multiset ...
 - 09--STL关联容器(map/multimap)
		
一:map/multimap的简介 map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对.它提供基于key的快速检索能力. map中key值是唯一的.集合中的元素按一定的顺 ...
 - C++ 之关联容器 map
		
标准库定义了四种关联容器:map是其中之一(另外还有set.multimap.multiset).map的元素以键-值(key-value),在学了顺序容器之后,再学习关联容器,就比较比较好理解了. ...
 - 关联容器(map):支持高效查找的容器,一种键值对的集合。
		
#include <iostream> #include <string> #include <map> #include <vector> using ...
 - STL之关联容器
		
关联容器包含map.set.multimap.multiset. 关联容器的特点是明显的,相对于顺序容器,有如下特点: 1.其内部是采用非线性的二叉树结构,具体的说是红黑树的结构原理实现的. 2.se ...
 - C++学习基础四——顺序容器和关联容器
		
—顺序容器:vector,list,queue1.顺序容器的常见用法: #include <vector> #include <list> #include <queue ...
 - C++ 关联容器
		
<C++ Primer 4th>读书笔记 关联容器和顺序容器的本质差别在于:关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素. 关联容器(Ass ...
 - C++ Primer : 第十一章 : 关联容器之概述、有序关联容器关键字要求和pair类型
		
标准库定义了两种主要的关联容器:map和set map中的元素时一些关键字-值(key-value)对,关键字起到索引的作用,值则表示与索引相关的数据.set中每个元素只包含一个关键字,可以完成高效的 ...
 
随机推荐
- 优雅的使用Laravel之phpstorm配置
			
优雅的使用Laravel之phpstorm配置 先打开一个Laravel 项目,然后在project tool 窗口选择根节点.然后右键->Composer | Init composer . ...
 - 后台管理系统-使用AdminLTE搭建前端
			
返回总目录<ABP项目实战-后台管理系统-目录> 安装AdminLte 我们通过Nuget包管理器安装AdminLte 引用三方组件 因为AdminLte使用到了很多三方的组件,所以我们需 ...
 - Entity Framework 并发处理(转)
			
什么是并发? 并发分悲观并发和乐观并发. 悲观并发:比如有两个用户A,B,同时登录系统修改一个文档,如果A先进入修改,则系统会把该文档锁住,B就没办法打开了,只有等A修改完,完全退出的时候B才能进入修 ...
 - 人脸识别技术大总结(1):Face Detection & Alignment
			
http://blog.jobbole.com/85783/ 首页 最新文章 IT 职场 前端 后端 移动端 数据库 运维 其他技术 - 导航条 - 首页 最新文章 IT 职场 前端 - Ja ...
 - bzoj1620 / P2920 [USACO08NOV]时间管理Time Management
			
P2920 [USACO08NOV]时间管理Time Management 显然的贪心. 按deadline从大到小排序,然后依次填充时间. 最后时间为负的话那么就是无解 #include<io ...
 - linux及安全第五周总结——20135227黄晓妍
			
(注意:本文总结备份中有较多我手写笔记的图片,其中重要的部分打出来了.本文对分析system_call对应的汇编代码的工作过程,系统调用处理过程”的理解,以及流程图都写在实验部分.) 实验部分 使用g ...
 - linux第六周
			
一.知识概要 进程的描述 进程描述符task_struct数据结构(一)进程描述符task_struct数据结构(二)进程的创建 进程的创建概览及fork一个进程的用户态代码理解进程创建过程复杂代码的 ...
 - 20145211MSF基础应用实验
			
20145211MSF基础应用实验 一.实验博客 ms08_067攻击实验 http://www.cnblogs.com/entropy/p/6690301.html ms12_004漏洞攻击 htt ...
 - 20145325张梓靖 实验一 "Java开发环境的熟悉"
			
20145325张梓靖 实验一 "Java开发环境的熟悉" 程序设计过程 实验内容 实现凯撒密码,并进行测试 编写代码 使用java.util.Scanner进行输入,而它的方法里 ...
 - HDU 4272 LianLianKan (状压DP+DFS)题解
			
思路: 用状压DP+DFS遍历查找是否可行.假设一个数为x,那么他最远可以消去的点为x+9,因为x+1~x+4都能被他前面的点消去,所以我们将2进制的范围设为2^10,用0表示已经消去,1表示没有消去 ...