参考:http://www.weixueyuan.net/view/6404.html

总结:

  基本的关联式容器主要有:set、multiset、map和multimap,这四种容器可以分为两组:map和set。

  set可以理解为我们数学中的集合,它可以包含0个或多个不重复、不排序的数据,这些数据被称为键值。

  map也是一种集合,它同样可以包含0个或多个不排序的元素对,每一个元素对有一个键值和一个与键值相关联的值,在map中键值是不允许重复的。

  而multiset则是允许重复的集合,multimap则是允许有重复键值的map,因为multiset和multimap可以看做是set和map的扩展,因此我们将主要介绍set和map。

  对于set容器,insert被重载过,其调用方式有两种,但是无论以哪种方式进行调用,insert函数都能保证插入元素后set容器中不会出现重复的元素。

  find函数可以用于查找set容器中是否包含指定的键值,如果存在,则返回指向该键值的迭代器,如果不存在,则返回与end()函数相同的结果。

  map是一种关联式的列表,即将一个键值与一个值一一对应起来。

  键值在map中是不允许出现重复的,但是与键值对应的值value可以出现重复。如果键值出现相同,则以最后一次出现的作为结果。 

  map容器则需要通过itor->first访问键值,并用itor->second访问与键值对应的值。

--------------

基本的关联式容器主要有:set、multiset、map和multimap,这四种容器可以分为两组:map和set。

set可以理解为我们数学中的集合,它可以包含0个或多个不重复、不排序的数据,这些数据被称为键值map也是一种集合,它同样可以包含0个或多个不排序的元素对,每一个元素对有一个键值和一个与键值相关联的值,在map中键值是不允许重复的。而multiset则是允许重复的集合,multimap则是允许有重复键值的map,因为multiset和multimap可以看做是set和map的扩展,因此我们将主要介绍set和map。

例1:

#include <iostream>
#include <set>
using namespace std; int main()
{
set< int > s;
s.insert(s.begin(), );
s.insert();
s.insert(s.end(),);
s.insert();
s.insert();
s.insert();
s.insert();
s.insert();
set< int >::const_iterator itor;
for(itor = s.begin (); itor != s.end(); itor++)
cout<< *itor<<" ";
cout<< endl;
itor = s.find( );
if( itor == s.end() )
cout<< "NOT Found 2!" << endl;
else
cout<< "Found 2 in set!" << endl;
itor = s.find( );
if( itor == s.end() )
cout<< "NOT Found 5!" << endl;
else
cout<< "Found 5 in set!" << endl;
return ;
}

本例是set的一个示例,在主函数中我们先创建了一个set容器整型的示例s,之后就开始向容器中添加数据。对于set容器,insert被重载过,其调用方式有两种,我们既可以向前面序列式容器那样调用:

s.insert( s.begin(), );
s.insert( s.end(), );
也可以不指定插入位置,而直接插入元素:
s.insert(  );

但是无论以哪种方式进行调用,insert函数都能保证插入元素后set容器中不会出现重复的元素。

在插入一些元素之后,我们就定义了一个迭代器itor用于访问容器中的元素。访问的方法和序列式容器相同。

find函数可以用于查找set容器中是否包含指定的键值,如果存在,则返回指向该键值的迭代器,如果不存在,则返回与end()函数相同的结果。在例1中,我们分别查找了键值2和5是否存在于集合s中,因为s容器没有2元素,因此返回值等于s.end(),存在5元素,因此查找5元素时,函数返回结果不等于s.end()。

例2:

#include <iostream>
#include <map>
using namespace std; int main()
{
map< char, int > m;
m[ 'a' ] = ;
m[ 'b' ] = ;
m[ 'c' ] = ;
m[ 'd' ] = ;
m[ 'e' ] = ;
m[ 'f' ] = ;
m[ 'g' ] = ;
m[ 'h' ] = ;
m[ 'a' ] = ;
map< char, int >::iterator itor;
for(itor = m.begin(); itor != m.end(); itor++)
cout << itor->first << " -- " << itor->second <<endl;
return ;
}

本例是一个map容器的示例程序,map是一种关联式的列表,即将一个键值与一个值一一对应起来。我们直接来看主函数,主函数一开始定义了一个map容器示例m,“map< char, int > m;”语句中char表示键值的数据类型,int表示与键值对应的值的数据类型。我们用字符来作为键值,键值在map中是不允许出现重复的,但是与键值对应的值value可以出现重复,如本例中m[ 'a' ]和m[ 'e' ]相同。但是如果键值出现相同,则以最后一次出现的作为结果,例如本例中一开始“m[ 'a' ] = 1;”,在后面又出现“m[ 'a' ] = 0;”,此时不会有语法错误,这两句可以理解为“m[ 'a' ] = 1;”是给“m[ 'a' ]”赋初值,其值为1,而“m[ 'a' ] = 0;”则可以理解为我们将“m[ 'a' ]”的值由1修改为0。

遍历map时同样是使用迭代器,在函数中我们定义了一个迭代器itor,由于map中是由元素对组成的,包含两个元素,因此遍历方法与前面所介绍的容器稍有不同,前面的容器用*itor就可以直接获得所需要的元素,而map容器则需要通过itor->first访问键值,并用itor->second访问与键值对应的值。

例2最终运行结果如下:
a–– 0
b –– 2
c –– 3
d –– 4
e –– 1
f –– 2
g –– 3
h –– 4

7.7 C++基本关联式容器的更多相关文章

  1. STL源码分析读书笔记--第5章--关联式容器

    1.关联式容器的概念 上一篇文章讲序列式容器,序列式容器的概念与关联式容器相对,不提供按序索引.它分为set和map两大类,这两大类各自有各自的衍生体multiset和multimap,的底层机制都是 ...

  2. 关联式容器(associative containers)

    关联式容器(associative containers) 根据数据在容器中的排列特性,容器可分为序列式(sequence)和关联式(associative)两种. 标准的STL关联式容器分为set( ...

  3. Map(关联式容器)

    map是一类关联式容器,自动建立Key - Value的对应 , key 和 Value可以是任意你需要的类型.下面介绍 map 中一些常用的函数: 一.map 中的 begin 和 end 函数 m ...

  4. C++ 容器:顺序性容器、关联式容器和容器适配器

    什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器.很简单,容器就是保存其它对象的对象 ...

  5. STL——关联式容器

    一.关联式容器 标准的STL关联式容器分为set(集合)/map(映射表)两大类,以及这两大类的衍生体multiset(多键集合)和 multimap(多键映射表).这些容器的底层机制均以RB-tre ...

  6. STL学习笔记--关联式容器

    关联式容器依据特定的排序准则,自动为其元素排序.缺省情况下以operator<进行比较.set multiset map multimap是一种非线性的树结构,具体的说是采用一种比较高效的特殊平 ...

  7. C++关联式容器的排序准则

    stl中set和map为关联式容器,会根据排序准将元素自动排序.原型如下: template<class _Kty, class _Pr = less<_Kty>, class _A ...

  8. vector是序列式容器而set是关联式容器。set包含0个或多个不重复不排序的元素。

    1.vector是序列式容器而set是关联式容器.set包含0个或多个不重复不排序的元素.也就是说set能够保证它里面所有的元素都是不重复的.另外对set容器进行插入时可以指定插入位置或者不指定插入位 ...

  9. STL学习笔记(关联式容器)

    Set和Multisets set和multiset会根据特定的排序准则,自动将元素排序.两者不同在于multisets允许元素重复而set不允许. 1.set和multiset的操作函数 生成.复制 ...

随机推荐

  1. php如何控制客户端生成缓存

    php如何控制客户端生成缓存 一.总结 一句话总结:用http消息响应头中的Cache-Control来控制客户端缓存,说的是页面本身被客户端缓存,而不是重新生成的其它的非页面缓存 响应头Cache- ...

  2. MyBatis-session-SqlSession

    The SqlSession instance is the most powerful in MyBatis. It is where you'll find all of the methods ...

  3. Android中简单活动窗口的切换--Android

    本例实现Android中简单Activity窗口切换:借助intent(意图)对应用操作(这里用按钮监听)等的描述,Android根据描述负责找对应的组件,完成组件的调用来实现活动的切换……案例比较简 ...

  4. LeetCode--459--重复的字符串

    问题描述: 给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成.给定的字符串只含有小写英文字母,并且长度不超过10000. 示例 1: 输入: "abab" 输出: T ...

  5. 20170907wdVBA_ImportPicturesBaseOnExcel

    Public Sub ImportPicturesBaseOnExcel() Dim shp As Object Dim xlApp As Object Dim Wb As Object Dim Rn ...

  6. gcc请不要优化

    gdb跟踪剖发现free_area_init中一段优化错了,如下:    memset(mem_map, 0, start_mem - (unsigned long) mem_map);    do ...

  7. android--------自定义控件 之 组合控件篇

    上篇介绍了自定义控件的自定义属性篇,地址:http://www.cnblogs.com/zhangqie/p/8969163.html 这篇博文主要来说说 自定义控件的组合控件来提高布局的复用 使用自 ...

  8. 【洛谷p2669】【一本通p1100】金币

    (今天高产) 金币[传送门] 洛谷上的算法标签 自我感觉主要靠循环 这道题是2015年NOIp普及组的题,其实还是很简单的.但为什么写这道题呢? 这道题第一次接触是在一本通刷题的时候,当时学循环结构, ...

  9. python基础之lambda,sort,filter,map,递归函数的运用

    内容梗概:1. lamda 匿名函数2. sorted()3. filter()4. map()5. 递归函数 1.lambda 形式: lambda 参数:返回值 f = lambda x,y: x ...

  10. 优先队列优化dij算法

    之前已经弄过模板了,但那个复杂一点,这个就是裸的dij,用起来更方便 输入格式:n,m,s,d分别是点数,边数,起点,终点 之后m行,输入x,y,z分别是两点即权值 题目链接:https://www. ...