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中每个元素只包含一个关键字,可以完成高效的 ...
随机推荐
- Spark Shuffle(ExternalSorter)
1.Shuffle流程 spark的shuffle过程如下图所示,和mapreduce中的类似,但在spark2.0及之后的版本中只存在SortShuffleManager而将原来的HashShuff ...
- MongoDB之Replica Set(复制集复制)
MongoDB支持两种复制模式: 主从复制(Master/Slave) 复制集复制(Replica Set) 下面主要记录我在centos虚拟机上安装replica set,主要参考:http://d ...
- 如何把PDF文件转换为JPG图片
大家有遇到需要将PDF文件转换为JPG的情况么,文档资料里面经常会有一些图片类型的内容,有的时候我们需要获取这些图片内容,但是PDF文件又是不可编辑的,那如何把PDF文件转换为JPG图片呢,跟着小编一 ...
- web http协议
http协议超文本传输协议 http协议是IOS七层协议的应用层,是基于TCP/IP协议的,为什么还要多一个协议了,其实利用TCP协议也是可以的,但是TCP三次握手后是一直保持连接的,如果单单是c/s ...
- MyEclipse优化,解决MyEclipse运行慢、卡顿问题
工具: myeclipse2015 2.0 最近想用myeclipse做一下测试,发现myeclipse运行非常卡,直接影响代码的开发,而且还出现软件卡退的情况,让我十分恼火. 一.加大JVM的非 ...
- springcloud16---zuul-filter
package com.itmuch.cloud; import org.springframework.boot.SpringApplication; import org.springframew ...
- selenium 中装饰器作用
前面讲到unittest里面setUp可以在每次执行用例前执行,这样有效的减少了代码量,但是有个弊端,比如打开浏览器操作,每次执行用例时候都会重新打开,这样就会浪费很多时间.于是就想是不是可以只打开一 ...
- 微信JS支付代码_前端调用微信支付接口
转自:http://dditblog.com/itshare_553.html 跟大家分享一段微信支付的js代码片段.V3版的微信支付没有paySignKey参数.基本上是直接复制就可以使用了.改一改 ...
- 详细了解下PHP的curl函数及常用之处
CURL 是一个利用URL语法规定来传输文件和数据的工具,支持很多协议,如HTTP.FTP.TELNET等,我们使用它来发送HTTP请求.正因为这么强大,当然PHP也支持 CURL 库,前提是你的ph ...
- Cannot perform runtime binding on a null reference
一个方法的参数是dynamic obj 方法内调用了obj.Header 但是外部传递进来的obj是null,然后就会报这个错.