点击查看Evernote原文。
#@author: gr
#@date: 2014-08-23
#@email: forgerui@gmail.com
STL中的关联容器。
###stl学习
|--迭代器
|--类属算法
|--容器
|--vector
|--deque
|--list
|--set
|--map
|--函数对象
|--适配器
|--分配器
一、Contents
1. why关联容器
序列容器以线性排列方式保存数据项,并且各数据项保持了它们在插入时的相对位置,关联容器则摒弃了这种顺序,把注意力集中在如何通过保存在数据中的索引项来尽可能快地检索到数据项。
2. 实现形式
一种方法可以把索引项按照某种全序关系排列起来,用二叉树查找,时间复杂度为O(log N)
。
一种方法是使用散列函数,时间复杂度为常数。
3. 四种关联容器
set
和multiset
,其数据项就是索引项本身,其区别是multiset
允许出现重复索引项。map
和multimap
,数据项是由索引项和其他的数据类型组成的一对数据,同样,区别就是multimap
允许出现重复索引项。
4. set && multiset
template <typename Key, typename Compare = less<Key>, class Allocator = allocator<Key> >
5. insert
//set最简单的insert函数只有一个参数
set set1;
for(list<int>::iterator it = list1.begin(); it != list1.end(); it++){
set1.insert(*it);
}
set
和multiset
定义的insert
有些不同,下面是set的定义:
pair<interator, boo> insert(const value_type& x);
multiset
的insert
定义:
iterator insert(const value_type& x);
set
中不允许有重复元素,所以不一定插入成功,所以需要返回一个bool,表明是否插入成功。
它们还提供一个关于位置的insert
成员函数,这个位置不是插入的位置,插入的位置由比较函数确定,而是从该位置搜索插入位置。
iterator insert(iterator position, const value_type& x);
使用inserter
插入迭代器:
copy(list1.begin(), list1.end(), inserter(multiset1, multiset1.end() ));
6. erase
//删除所有索引值为e的元素
multiset1.erase('e');
//删除第一个e元素
multiset1.erase(multiset.find('e'));
//删除一个区间,迭代器[i, j)
multiset.erase(i, j);
7. 访问器
lower_bound
表示索引的第一个位置,upper_bound
表示最后一个位置。
//multiset1: aaabccccddeeefhhhxy
multiset<char>::iterator i = multiset1.lower_bound('c');
multiset<char>::iterator j = multiset1.upper_bound('h')
//erase之后,multiset1值为: aaabxy
multiset1.erase(i, j);
如果lower_bound
和upper_bound
作用于同一个索引值,则可以使用equal_range
,返回一对迭代器,上面的代码可以写为下面的形式:
pair<multiset<char>::iterator, multiset<char>::iterator> > p = multiset1.equal_range('s');
multiset1.erase(p->first, p->second);
另外,count
函数可以获取索引值的个数:
int num = multiset1.count('s');
8. map && multimap
map
和multimap
类的模板定义:
template <typename Key, typename T, typename Compare = less<Key>,
class Allocator = allocator<pair<const Key, T> > >
9. 插入
map
的insert
函数需要求一个pair
做参数。
map.insert(pair<const Key, T>);
也可以使用运算符[]
,比如
map[k] = t;
如果不存在索引值为k的元素,则插入元素(k, t),如果已经存在某个元素(k, t0),则以t代替t0。
还可以用如下的替换操作:
//i为map<Key, T>::iterator
i->second = t;
//索引值是const, 不能修改,下面的语句是错误的
i->first = k1;
10. 删除
和集合一样,可以通过索引或位置删除映射和多映射中的元素。
11. 访问器
有下面的访问器:
begin,end,size,empty,find,lower_bound,upper_bound,equal_range,count,operatar[]...
二、Miscellany
@author gr
@mail forgerui@gmail.com
###STL学习--关联容器的更多相关文章
-
STL之关联容器的映射底层
STL的关联容器有set, map, multiset, multimap.用于实现它们的底层容器有划入标准的rb_tree和待增加标准的hashtable. 底层容器rb_tree为上层容器提供了一 ...
-
STL之关联容器---set, mutilset, map, mutilmap
STL的容器分为序列容器和关联容器.它们所表达的数据结构各有不同: 序列容器:vector(变长数组), list(链表), queue(队列), heap(堆算法)等 关联容器:set/mutils ...
-
侯捷STL学习(十)--容器hashtable探索(unordered set/map)
layout: post title: 侯捷STL学习(十) date: 2017-07-23 tag: 侯捷STL --- 第二十三节 容器hashtable探索 hashtable冲突(碰撞)处理 ...
-
STL之关联容器
关联容器包含map.set.multimap.multiset. 关联容器的特点是明显的,相对于顺序容器,有如下特点: 1.其内部是采用非线性的二叉树结构,具体的说是红黑树的结构原理实现的. 2.se ...
-
STL学习笔记— —容器map和multimap
简单介绍 在头文件<map> 中定义 namespace std { template <typename Key, typename T, typename Compare = l ...
-
【STL】关联容器 — hash_set
容器hash_set是以hash table为底层机制的,差点儿所有的操作都是转调用hash table提供的接口.因为插入无法存储同样的键值,所以hash_set的插入操作所有都使用hash tab ...
-
C++ STL学习之容器set和multiset (补充材料)
一.set和multiset基础 set和multiset会根据特定的排序准则,自动将元素进行排序.不同的是后者允许元素重复而前者不允许. 需要包含头文件: #include <set> ...
-
【STL】关联容器 — hashtable
C++ 11哈希表已被列入标准列.hashtable这是hash_set.hash_map.hash_multiset.hash_multimap的底层机制.即这四种容器中都包括一个hashtable ...
-
STL - 常用关联容器代码 - set &; multiset
代码如下: /* 5. set & multiset */ set<string> cities{ "Braunschweig", "Hanover& ...
随机推荐
-
【Swift学习】Swift编程之旅---可选链(二十一)
可选链Optional Chaining是一种可以在当前值可能为nil的可选值上请求和调用属性.方法及下标的方法.如果可选值有值,那么调用就会成功:如果可选值是nil,那么调用将返回nil.多个调用可 ...
-
POJ-1655 Balancing Act
题目大意:一棵n个节点的树,找出最大子树最小的节点. 题目分析:过程类似求重心. 代码如下: # include<iostream> # include<cstdio> # i ...
-
MVC 百度地图的基本使用
最近做的这个项目里面为了方便路线查询,将百度地图的插件加到了项目里,效果图如下: 下面我就把我的步骤贴出来: 第一步:进网站 http://developer.baidu.com/map/注册 第二步 ...
-
Windows Server 2003 激活码及激活方法
Windows Server 2003 简体中文企业版,真正免激活. CD-KEY:JB88F-WT2Q3-DPXTT-Y8GHG-7YYQY 安装序列号:JCGMJ-TC669-KCBG7-HB8X ...
-
一排下去再上来的div
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
-
Python之函数进阶
本节内容 上一篇中介绍了Python中函数的定义.函数的调用.函数的参数以及变量的作用域等内容,现在来说下函数的一些高级特性: 递归函数 嵌套函数与闭包 匿名函数 高阶函数 内置函数 总结 一.递归函 ...
-
Extjs实现进度条
做Extjs开发中,往往后台程序可能要执行一段时间才能得到返回结果,加入进度条可以提高客户体验度,以下为两种便捷的方式: 1.提交数据前用Ext.Msg.wait('提示','正在处理数据,请稍候') ...
-
VSTO 学习笔记(十)Office 2010 Ribbon开发
原文:VSTO 学习笔记(十)Office 2010 Ribbon开发 微软的Office系列办公套件从Office 2007开始首次引入了Ribbon导航菜单模式,其将一系列相关的功能集成在一个个R ...
-
前端(HTML/CSS/JS)-HTML编码规范
一.HTML编码规范 1. img标签要写alt属性 根据W3C标准,img标签要写alt属性,如果没有就写一个空的.但是一般要写一个有内容的,根据图片想要表达的意思,因为alt是在图片无法加载时显示 ...
-
lua中 table 重构index/pairs元方法优化table内存占用
转载请标明出处http://www.cnblogs.com/zblade/ lua作为游戏的热更新首选的脚本,其优势不再过多的赘述.今天,我主要写一下如何重写lua中的元方法,通过自己的重写来实现对l ...