Fork me on GitHub

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 == 0)
    {
        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(99,"sun"));  
mapScore.insert(std::make_pair(79,"gao")); 
mapScore.insert(std::make_pair(86,"zhao"));  
mapScore.insert(std::make_pair(92,"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"] = 90;  
mapScore["ZiLinMi"] = 79;  
mapScore["BoB"] = 92;  
mapScore.insert(std::make_pair("Bing",99));  
mapScore.insert(std::make_pair("Albert",86));  
//把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,底层是哈希表。

迭代器

算法

 

posted @ 2016-07-30 20:25  晨光iABC  阅读(898)  评论(0编辑  收藏  举报