STL学习笔记
简介
STL(Standard Template Library),即标准模版库,涵盖了常用的数据结构和算法,并具有跨平台的特点。STL是C++标准函数库的一部分,如下图所示:

STL含有容器、算法和迭代器组件,其之间的合作如下图所示:

STL的底层机制都是以RB-tree(红黑树)完成的。一个红黑树是一棵二叉树。
容器
标准序列式容器
字符串(string)
std::string不能初始化为NULL。
向量(vector)
向量(vector) 连续存储的元素。
vector和数组类似,拥有一段连续的内存空间,且起始地址不变,因此能非常好的支持随机存储。
为了提高效率,vector在添加元素之前最好调用reserve()设置容量。
(1)清空
std::vector<std::string> str; std::vector<std::string>().swap(str);
str.clear();
(2)删除符合条件的元素
vector<int> iVec; vector<int>::iterator it;
for(it=iVec.begin();it!=iVec.end();)
{
if(*it == )
{
it=iVec.erase(it);//删除元素,返回值指向已删除元素的下一个位置
}
else
{
++it;//指向下一个位置
}
}
注意:每次调用erase()函数后,被删除之后的内容会自动往前移。
(3)使用sort排序,需要头文件#include<algorithm>
sort(vec.begin(),vec.end());//默认是按升序排列,即从小到大
可以通过重写排序比较函数按照降序比较,定义排序比较函数如下:
bool Comp(const int &a,const int &b)
{
return a>b;
}
按如下方式调用即可实现降序排序:
sort(vec.begin(),vec.end(),Comp)
列表(list)
列表(list) 由节点组成的双向链表,每个结点包含着一个元素。
list是由数据结构中的双向链表实现的,其内存空间可以是不连续的,只能通过指针来进行数据的访问。由于链表的特点,其可以以很好的效率支持任意地方的删除和插入。
双端队列(deque)
双端队列(deque) 连续存储的指向不同元素的指针所组成的数组。
deque是由一段一段定量的连续空间组成的,是动态数组类型。
容器适配器
栈(stack)
栈(stack) 后进先出的值的排列。
队列(queue)
队列(queue) 先进先出的值的排列。
优先队列(priority_queue)
优先队列(priority_queue) 元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列。
标准关联式容器
关联容器的内部结构是一个平衡二叉树(balanced binary tree)。平衡二叉树有如下几种:
- AVL-tree
- RB-tree
- AA-tree
集合(set)
集合(set) 由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序。
多重集合(multiset)
多重集合(multiset) 允许存在两个次序相等的元素的集合。
映射(map)
映射(map) 由{键,值}对组成的集合,以某种作用于键对上的谓词排列。map底层是红黑树RB-tree。
(1)按键排序
为了实现快速查找,map内部本身就是按序存储的(比如红黑树)。在我们插入<key, value>键值对时,就会按照key的大小顺序进行存储。默认排序是按照从小到大。
//按键排序,默认排序是按照从小到大
std::map<int,std::string> mapScore;
mapScore.insert(std::make_pair(,"sun"));
mapScore.insert(std::make_pair(,"gao"));
mapScore.insert(std::make_pair(,"zhao"));
mapScore.insert(std::make_pair(,"yuan"));
(2)按值排序
//按值排序
struct CmpByValue {
bool operator()(const std::pair<std::string,int> & lhs, const std::pair<std::string,int> & rhs)
{return lhs.second > rhs.second;}
};
std::map<std::string, int> mapScore;
mapScore["LiMin"] = ;
mapScore["ZiLinMi"] = ;
mapScore["BoB"] = ;
mapScore.insert(std::make_pair("Bing",));
mapScore.insert(std::make_pair("Albert",));
//把map中元素转存到vector中
std::vector<std::pair<std::string, int>> vecMapScore(mapScore.begin(), mapScore.end());
sort(vecMapScore.begin(), vecMapScore.end(), CmpByValue());
参考链接:http://blog.csdn.net/iicy266/article/details/11906189?utm_source=tuicool&utm_medium=referral
多重映射(multimap)
多重映射(multimap) 允许键对有相等的次序的映射。
非标准关联式容器
hashmap、hashset、hashtable,底层是哈希表。
迭代器
算法
STL学习笔记的更多相关文章
- Effective STL 学习笔记 39 ~ 41
Effective STL 学习笔记 39 ~ 41 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value
Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value */--> div.org-src-container ...
- Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据
Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据 */--> div.org-src-container { font-size: 85%; font-fam ...
- Effective STL 学习笔记 32 ~ 33
Effective STL 学习笔记 32 ~ 33 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- Effective STL 学习笔记 31:排序算法
Effective STL 学习笔记 31:排序算法 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
- Effective STL 学习笔记 Item 30: 保证目标区间足够大
Effective STL 学习笔记 Item 30: 保证目标区间足够大 */--> div.org-src-container { font-size: 85%; font-family: ...
- Effective STL 学习笔记 Item 26: Prefer Iterator to reverse_iterator and const_rever_itertor
Effective STL 学习笔记 Item 26: Prefer Iterator to reverse_iterator and const_rever_itertor */--> div ...
- Effective STL 学习笔记: Item 22 ~ 24
Effective STL 学习笔记: Item 22 ~ 24 */--> div.org-src-container { font-size: 85%; font-family: monos ...
- Effective STL 学习笔记 Item 21:Comparison Function 相关
Effective STL 学习笔记 Item 21:Comparison Function 相关 */--> div.org-src-container { font-size: 85%; f ...
- Effective STL 学习笔记:19 ~ 20
Effective STL 学习笔记:19 ~ 20 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...
随机推荐
- java线程内存模型,线程、工作内存、主内存
转自:http://rainyear.iteye.com/blog/1734311 java线程内存模型 线程.工作内存.主内存三者之间的交互关系图: key edeas 所有线程共享主内存 每个线程 ...
- dubbo-admin重新编译后部署出现 valid LOC header (bad signature)异常
前段时间从网上下载dubbo-admin发现在jdk1.7下不可用,后来根据网上说的升级了jar包版本还是有问题,于是观察了编译发现编译时出现类似如下异常: --------------------- ...
- C# 异常:从作用域“”引用了“FiasHostApp.Entity.DBEntity.FIAS_RM_v1.ITraNetMgrUnitBaseInfoRecord”类型的变量“w”,但该变量未定义
C# 异常:从作用域“”引用了“FiasHostApp.Entity.DBEntity.FIAS_RM_v1.ITraNetMgrUnitBaseInfoRecord”类型的变量“w”,但该变量未定义 ...
- 新建一个UI窗口-XproerUI(MFC)教程
版权所有 2009-2015 荆门泽优软件有限公司 保留所有权利 产品首页:http://www.ncmem.com/apps/xproerui/index.asp 在线文档(XproerUI):Xp ...
- 13 Balls Problem
今天讨论的是称球问题. No.3 13 balls problem You are given 13 balls. The odd ball may be either heavier or ligh ...
- ZipFile解压文件不改变压缩包内文件修改日期的方法
本文参考http://stackoverflow.com/questions/9813243/extract-files-from-zip-file-and-retain-mod-date-pytho ...
- const 限定符
1.定义const对象 const限定符把一个对象转换成一个常量 const int Bufsize = 512; 定义Bufsize 为常量并初始化为512.变量Bufsize仍然是一个左值,但是不 ...
- 粒子拼字效果(getImageData方法)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- RegExp对象
RegExp()构造函数带有两个字符串参数,其中第二个是可选的,如果提供第二个参数,它就指定正则表达式的修饰符.第一个函数包含正则表达式的主题部分,也就是正则表达式直接量中两条斜线之间的文本.无论是字 ...
- RunLoop(官方文档翻译)
循环运行 运行循环是与线程相关联的基本基础设施的一部分.一个运行循环是用于调度工作,并协调接收传入事件的事件处理循环.一个运行循环的目的是让你的线程繁忙时,有工作要做,把你的线程时有没有睡觉. 循环运 ...