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)的更多相关文章

  1. STL的基本使用之关联容器:map和multiMap的基本使用

    STL的基本使用之关联容器:map和multiMap的基本使用 简介 map 和 multimap 内部也都是使用红黑树来实现,他们存储的是键值对,并且会自动将元素的key进行排序.两者不同在于map ...

  2. 【STL容器学习】-关联容器与map的用法

    STL提供了4个关联容器:set.multiset.map和multimap.这些容器提供了通过keyword高速存储和訪问数据元素的能力.Set和map不同意有反复keyword,而multiset ...

  3. 09--STL关联容器(map/multimap)

    一:map/multimap的简介 map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对.它提供基于key的快速检索能力. map中key值是唯一的.集合中的元素按一定的顺 ...

  4. C++ 之关联容器 map

    标准库定义了四种关联容器:map是其中之一(另外还有set.multimap.multiset).map的元素以键-值(key-value),在学了顺序容器之后,再学习关联容器,就比较比较好理解了. ...

  5. 关联容器(map):支持高效查找的容器,一种键值对的集合。

    #include <iostream> #include <string> #include <map> #include <vector> using ...

  6. STL之关联容器

    关联容器包含map.set.multimap.multiset. 关联容器的特点是明显的,相对于顺序容器,有如下特点: 1.其内部是采用非线性的二叉树结构,具体的说是红黑树的结构原理实现的. 2.se ...

  7. C++学习基础四——顺序容器和关联容器

    —顺序容器:vector,list,queue1.顺序容器的常见用法: #include <vector> #include <list> #include <queue ...

  8. C++ 关联容器

    <C++ Primer 4th>读书笔记 关联容器和顺序容器的本质差别在于:关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素. 关联容器(Ass ...

  9. C++ Primer : 第十一章 : 关联容器之概述、有序关联容器关键字要求和pair类型

    标准库定义了两种主要的关联容器:map和set map中的元素时一些关键字-值(key-value)对,关键字起到索引的作用,值则表示与索引相关的数据.set中每个元素只包含一个关键字,可以完成高效的 ...

随机推荐

  1. Spark Streaming里面使用文本分析模型

    功能:接收来自kafka的数据,数据是一篇文章,来判断文章的类型,把判断的结果一并保存到Hbase,并把文章建立索引(没有代码只有一个空壳,可以自己实现,以后有机会了可能会补上) import org ...

  2. java打印随机函数

    一 ,打印1-10的随机函数 public static void randomprint(){      for (int i=0;i<100;i++){          //打印一百次  ...

  3. uva11795

    这题说的是一个人要消灭 所有的机器人,但是他有他可以消灭的机器人,他可以通过它消灭的机器人的武器去消灭其他的机器人, 给了一个可以消灭的关系的矩阵,计算消灭这些机器人的顺序的不同方案是多少种 , 刚开 ...

  4. 20155333 2016-2017-2 《Java程序设计》第七周学习总结

    20155333 2016-2017-2 <Java程序设计>第七周学习总结 教材学习内容总结 Lambda 教材的引入循序渐近.深入浅出 Lambda去重复,回忆DRY原则 Lambda ...

  5. centos设置代理上网

    centos设置代理上网   假设我们要设置代理为 IP:PORT 1.网页上网 网页上网设置代理很简单,在firefox浏览器下 Edit-->>Preferences-->> ...

  6. node学习笔记第一天

    ES6---* JavaScript语言随着使用的人越来越多,ECMA语法规范:if/else* 为了让js语言更适应大型应用的开发.旨在消除一些怪异的行为 ### 包含内容(strict严格模式)- ...

  7. web实现负载均衡的几种实现方式

    摘要: 负载均衡(Load Balance)是集群技术(Cluster)的一种应用.负载均衡可以将工作任务分摊到多个处理单元,从而提高并发处理能力.目前最常见的负载均衡应用是Web负载均衡.根据实现的 ...

  8. java类同时引用父类和接口的成员变量,需要指明是父类的还是接口的

    code: package com.qhong; public class Main extends B implements A{ public static void main(String[] ...

  9. POJ 1637 Sightseeing tour(混合图欧拉回路+最大流)

    http://poj.org/problem?id=1637 题意:给出n个点和m条边,这些边有些是单向边,有些是双向边,判断是否能构成欧拉回路. 思路: 构成有向图欧拉回路的要求是入度=出度,无向图 ...

  10. HDU 1698 Just a Hook(线段树:区间更新)

    http://acm.hdu.edu.cn/showproblem.php?pid=1698 题意:给出1~n的数,每个数初始为1,每次改变[a,b]的值,最后求1~n的值之和. 思路: 区间更新题目 ...