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中每个元素只包含一个关键字,可以完成高效的 ...
随机推荐
- 装饰器的修复wraps,偏函数partial 以及chain
将被装饰的函数的一些属性值赋值给 装饰器函数,最终让属性的显示更符合我们的直觉. from functools import wraps def wapper(func): @wraps(func) ...
- ReactNative 环境配置
一直是从事iOS的开发,现在研究下mac环境下reatNative的环境配置: 1. 安装HomeBlew(OS系统上的一个安装包管理器,安装后可以方便后续安装包的安装.) 终端命令: ruby -e ...
- 4.8 Routing -- Specifying The URL Type
1. 默认的路由器使用浏览器的hash来加载应用程序的开始状态并且当你移动时同步保持.目前,这依赖于浏览器中存在的hashchange事件. 2. 假设下面的路由器,输入/#/posts/new将会把 ...
- 4.11 Routing -- Loading/Error Substates
除了在上节中描述的技术,Ember路由器通过使用error和loading substates为自定义异步跳转提供强大而可重写的约定. 一.loading Substates 1. 在跳转过程中,Em ...
- python实现指定目录下批量文件的单词计数:并发版本
在 文章 <python实现指定目录下批量文件的单词计数:串行版本>中, 总体思路是: A. 一次性获取指定目录下的所有符合条件的文件 -> B. 一次性获取所有文件的所有文件行 - ...
- deepin中crossover或playonlinux装完office后word无法输入中文的问题
原因:office安装是自带了一个微软输入法 解决:装offce时进行自定义安装,在office共享功能里,把输入法去掉. 参考: https://jingyan.baidu.com/article/ ...
- 《Java入门第二季》第五章 阶段练习
/** * ┏┓ ┏┓ * ┏┛┻━━━┛┻┓ * ┃ ┃ * ┃ ━ ┃ * ┃ > < ┃ * ┃ ┃ * ┃... ⌒ ... ┃ * ┃ ┃ * ┗━┓ ┏━┛ * ┃ ┃ Cod ...
- 文件读写网络IO简单了解,同步IO和异步IO
在Linux中,对文件的读写其实就是IO. 与IO有关的名词:同步,异步,阻塞,非阻塞,甚至是同步阻塞,同步非阻塞,异步阻塞,异步非阻塞.别急,下面有举例IO分为两大种,同步和异步 同步IO:阻塞IO ...
- Java基础学习笔记(一)
Java基础学习笔记(一) Hello World 基础代码学习 代码编写基础结构 class :类,一个类即一个java代码,形成一个class文件,写于每个代码的前端(注意无大写字母) XxxYy ...
- 初识PHP(二)常用函数
在此记录一些常用库函数和常用语法以便查阅 一.PHP手册 php手册中文地址 http://php.net/manual/zh 二.一些常用操作 2.1字符串操作 2.1.1 strpos — 查找字 ...