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唯一,有序,算法对数级。仅仅能作为初学者参考。

原文地址:https://www.cnblogs.com/Stultz-Lee/p/10040107.html

时间: 2024-11-07 12:46:20

c++的关联容器入门(map and set)的相关文章

C++STL之关联容器【map】【set】

map以键-值対的形式组织,键的作用在于索引,而值表示所存储和读取数据. set仅包含一个键,并且有效的支持某个键是否存在的查询. 他们都是基于标准型类库pair实现,该类型在utility头文件中. 一:关于pair类型的操作 pair<T1,T2> p1; //创建一个空pair类型 pair<T1,T2> p1(v1,v2); //创建并初始化 make_pair(v1,v2) //生成pair对象 <,>,==,!=  //类型之间比较,遵循字典序,先比较fir

CH11 关联容器

关联容器与顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的,而顺序容器是按它们在容器中的位置来顺序保存和访问的.两个主要的关联容器:map和set map 中的元素的是一个key-value对:关键字是用来索引值关联的数据.set:每个关键字值包含一个关键字. 关联容器类型: map 保存key-value  map<key,value> set 保存关键字key set<key> multimap 关键字可以重复出现的map multiset 关键字可以重复出现的

c++关联容器

1.关联容器介绍 关联容器中的元素是按关键字来保存和访问的.两个主要的关联容器类型是map和set.map中元素是关键字-值对.set中每个元素只包含一个关键字.允许重复关键字的容器为multimap和multiset.无序的在前面加上unorder_ 2.使用关联容器 使用map://相当于  人名-电话号 map<string,size_t> word_count; string word; while(cin>>word) ++word_count[word];//提取wor

STL2——关联容器

关联容器 关联容器支持通过键(key)来高效地查找和读取元素.两个基本的关联容器是map和set,map的元素以键-值对形式组织,键用做索引,值表示存储和读取的数据,set包含一个键,并有效地支持关于某个键是否存在的查询. 引言:pair类型 #include<utility> pair<int,int>p; p.first=5; p.second=6; pair<int,int>p2; p2=make_pair(5,7); pair<int,int>p3(

c++ primer 10 关联容器

关联容器和顺序容器的本质差别在于:关联容器通过键(key)存储和读取元素,顺序容器则通过元素在容器中的位置顺序存储和访问元素 关联容器类型 map 关联数组:元素通过键来存储和读取 set 大小可变的集合,支持通过键实现的快速读取 multimap 支持同一个键多次出现的 map 类型 multiset 支持同一个键多次出现的 set 类型 pair类型 pair是一种模版类型,在创建pair对象,必须提供两个类型名. 头文件 utility pairs 类型提供的操作 pair<T1, T2>

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

—顺序容器:vector,list,queue1.顺序容器的常见用法: #include <vector> #include <list> #include <queue> (1)vector声明 vector<string> svec;(2)添加元素: c.push_back(t): 在容器 c 的尾部添加值为 t 的元素.返回 void 类型  c.push_front(t):在容器 c 的前端添加值为 t 的元素.返回 void 类型 只适用于 lis

C++primer笔记:IO库、顺序容器、关联容器、面向对象、泛型算法、模板和泛型编程

第八章:IO库不直接来处理输入输出,而是通过在标准库中的一些类型来处理io istream ostream cin cout cerr getline函数 iostream:定义了用于基本读写流的基本类型 fstream: 定义了基本的读写命名文件的类型 sstream:定义了读写内存的string对象的类型 IO对象无拷贝或者赋值 条件状态:IO定义了一些函数和标志,可以帮助我们访问和操作流得条件状态 strm::iostate 条件状态的完整功能 strm::badbit 流已崩溃 strm

第十一章:关联容器

关联容器 关联容器支持高效率的关键字查找和访问. 关联容器和顺序容器的本质差别在于:关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素. 关联容器(associative-container) :两个主要关联容器:map 和 set map 的元素以键-值(key-value)对的形式组织:键用作元素在 map 中的索引,而值则表示所存储和读取的数据.set 仅包含一个键,并有效地支持关于某个键是否存在的查询. 一般来说,如果希望有效地存储不同值的集合,

C++ Primer 学习笔记_34_STL实践与分析(8) --引言、pair类型、关联容器

STL实践与分析 --引言.pair类型.关联容器 引言: 关联容器与顺序容器的本质差别在于:关联容器通过键[key]来存储和读取元素,而顺序容器则通过元素在容器中的位置顺序的存取元素. map的元素以键-值[key-value]对的形式组织:键用作元素在map中的索引,而值则表示所存储和读取的数据. set仅包括一个键,并有效的支持关于某个键是否存在的查询. 关联容器类型 map 关联数组:元素通过键来存取 Set 大小可变的集合,支持通过键来实现的高速读取 multimap 支持同一个键多次