首先,适配器的概念

适配器的意思就是将某些已经存在的东西进行限制或者组合变成一个新的东西,这个新的东西体现一些新的特性,但底层都是由一些已经存在的东西实现的。

STL中的容器

vector :矢量(并非数学意义上的) STL最简单的序列类型,也是一些适配器的默认底层类

deque:双端队列可从头尾出队入队

list:双向链表

forwardd_list:单向链表,功能少一些,不可反转。

queue:队列,一个适配器类(底层模板类默认deque),不允许随机访问和历遍;展示队列的接口

priority_queue:优先队列,一个适配器类(底层模板类默认vector),默认大根堆(最大的元素在最前面)。

stack:栈,一个适配器类(底层模板类默认vector),给底层类提供典型的栈接口。

特别的

array:并非STL容器,长度固定,但也能使用一些STL算法

容器基本都有以下几种功能,具体情况视容器而定

p,q,i,j表示迭代器

序列基本要求,拿vector举例,p , q , i , j 表示迭代器

vector <int> vec (n,t); //创建并初始化
vector <int> (n,t);     //创建匿名对象并初始化
vector <int> vec (i,j); //创建并初始化为另一个容器[i,j)内容
vector <int>  (i,j);    //创建匿名对象并初始化为另一个容器[i,j)内容
vec.insert(p,t);        //插入t到p的前面
vec.insert(p,n,t);      //插入n个t到p的前面
vec.insert(p,i,j);      //将区间[i,j)插入到p的前面(可以为自己的区间后者其他容器的区间)
vec.erase(p);           //删除p指向的元素
vec.erase(p,q);         //删除[p,q)区间的元素
vec.clear();            //清空容器,等价于vec.erase(vec.begin(),vec.end());

一些可选要求,见名知义了,不解释。

.front();
.back();
.push_front();
.push_back();
.pop_front();
.pop_back();[n]
.at(n);

.at()和 [ ]很像,不过前者在越界是会引发一个异常,我们可以进行捕获

deque 

用双端队列演示上面的一些

#include <iostream>
#include <deque>
#include <algorithm>
using namespace std;
void show(int & t)
{cout << t << " ";
}
int main()
{deque<int> a(10,5);a.push_front(10);a.push_back(20);for_each(a.begin(),a.end(),show);cout << endl;a.pop_front();a.pop_back();for_each(a.begin(),a.end(),show);a.push_back(999);cout << endl << a.at(10) << " " << a[10];try{cout << endl << a.at(100);}catch (out_of_range){cout << "越界访问";}return 0;
}

运行结果

queue

一些queue的方法

priority_queue

可以用其进行堆排序

int main()
{srand((unsigned)time(NULL));priority_queue<int> pq;for(int i=0;i<100;i++){int x = rand() %1000+1;pq.push(x);}for(int i=0;i<100;i++){cout << pq.top() << " ";if(i%10 == 0)cout << endl;pq.pop();}return 0;
}

运行结果

时间复杂度O(nlogn),因为是基于树形结构,每次pop时间复杂度O(logn),进行n次。

一些方法

list

list的一些基本成员函数

void merge(list<T, Alloc> & X)

链表x与调用链表合并,在合并之前必须进行排序。合并后的链表存储在调用链表中,x变为空链表。线性时间复杂度

void remove(const T &val)

删除表中的所有val,线性时间复杂读。

void sort()

因为 list 不支持随机访问,不能使用 std::sort(),但是可以使用自带的 sotr,时间复杂度    O(nlogn)

void (iterator pos, list <T, Alloc> x)

将x链表插入到pos的前面,x变为空。固定时间复杂度。

void unique() 将连续的相同元素压缩为单个元素。线性时间复杂度

示例

#include <iostream>
#include <list>
#include <algorithm>
using namespace std;
void show(int & t)
{cout << t << " ";
}ostream & operator<<(ostream & os, list<int> & s)
{for_each(s.begin(),s.end(),show);return os;
}
int main()
{list <int> one (5,2);list <int> two (5,3);list <int> three;int num[5] = {1,6,3,5,2};three.insert(three.begin(),num,num+5);cout << "list one is " << one << endl;cout << "list two is " << two << endl;cout << "list three is(use insert) " << three << endl;three.sort();cout << "list three use sort " << three << endl;three.merge(two);cout << "list three use merge to list two \n" << "now list two is empty: ";cout << "list two is " << two << endl;cout << "now list three is " << three << endl;three.splice(three.begin(),one);cout << "three use splice to one \n" << "now list one is empty: ";cout << "now list one is " << one << endl;cout << "now list three is " << three << endl;three.unique();cout << "three use unique is " << three << endl;three.sort();cout << "list three use sort and unique: " << three << endl;three.remove(3);cout << "now use remove delete 3: " << three;return 0;
}

运行结果

注意merge(),不是简单的拼接,是有顺序的合并。而spille()才是拼接(插入)。

forwarrd_list

一些方法

stack

一些方法

关联容器

关联容器是队容器概念的另一个改进,关联容器将数据和关键字(key)存放在一起,用关键字来快速的查找数据。
STL提供了四种关联容器,set, multiset, map, multimap。

set(关联集合)

可翻转,可排序,并且存储进去的时候自动排好序。关键字唯一即一个数据有且只有一个关键字并且与存储类型相同。

#include <iostream>
#include <algorithm>
#include <set>
#include <iterator>
using namespace std;int main()
{const int n =6;string str[n] = {"hello", "world", "i am", "set use","C++","union"};//构造函数接受两个迭代器表示区间,初始化为区间内的内容set<string> A(str,str+6);ostream_iterator<string,char> out(cout,"\n");copy(A.begin(),A.end(),out);return 0;
}

运行结果

可以看见其已经自动排序

一些set的类方法

lower_bound()——接受一个关键字参数,返回一个迭代器,该迭代器指向第一个不小于关键字成员的参数(可能以关键字对应数开头,也可能不是)。

upper_bound()——同上,该迭代器指向第一个大于关键词的成员(类似超尾)。

演示

#include <iostream>
#include <algorithm>
#include <set>
#include <iterator>
using namespace std;int main()
{const int n =6;string str[n] = {"hello", "world", "i am", "set use","C++","union"};set<string> A(str,str+6);ostream_iterator<string,char> out(cout,"\n");//find string from b to rcopy(A.lower_bound("b"),A.upper_bound("s"),out);return 0;
}

运行结果

因为upper_bound()返回的是类似超尾迭代器的迭代器,所以不包括以‘s’开头的字符串

因为底层以树形结构实现得以快速查找,所以用户不能指定插入位置。并且插入后自动排序。

multimap(多关联图)

可反转,自动排序,关键字可与数据类型不同,一个关键字可与多个数据关联。

//<const key,type_name>
mutimap <int,string> mp; 

为了将信息结合在一起,数据与关键字用一个pair存储,所以插入等操作要插入pair 
一些方法

count()——接受一个关键字参数,返回该关键字所对应得数据个数。

lower_bound(), upper_bound(),同set。

equal_range()——接受一个关键字参数,返回两个迭代器,表示与该关键字所对应的区间,并且用一个二元组封装。

演示

#include <iostream>
#include <iterator>
#include <map>
using namespace std;
typedef pair<int,string> Pair;
int main()
{Pair p[6]={{6,"啤酒"},{10,"炒饭"},{80,"烤猪头"},{10,"冷面"},{5,"早餐"},{80,"给你一锤子"}};multimap<int,string> mulmap;// no operator <cout << "现在图中存储的关键字和数据是:" << endl;multimap<int,string> ::iterator i;for(int i =0;i<6;i++){mulmap.insert(p[i]);}for(auto i=mulmap.begin(); i!=mulmap.end(); i++){cout << i->first << " " << i->second << endl;}cout << "使用count函数找到价格为80的菜品个数为:" << mulmap.count(80) << endl;pair<multimap<int,string>::iterator,multimap<int,string>::iterator> temp;cout << "使用equal_range函数找到价格为80的菜品" << endl;temp = mulmap.equal_range(80);for(auto i = temp.first;i!=temp.second;i++){cout << i->second;}return 0;
}

运行结果

map(图)和multiset(多关联集合)的使用与上面类似。

无序关联容器

可以感觉到,关联容器底层基于某种数据结构,像树,能使其快速的进项操作。但又是因为树的原因,使得每个节点必须有着严格规定。

还有无序关联容器,底层数据结构基于哈希表(每个元素对应其映射,就像关键字一样)。

有四种:

unordered_set

unordered_multiset

unordered_map

unordered_multimap

和关联序列的方大同小异,在应用场景上会有些许不同。

C++——STL容器相关推荐

  1. C++ 笔记(19)— 标准模板库(STL容器、STL迭代器、STL算法、STL容器特点、STL字符串类)

    C++ 标准库可以分为两部分: 标准函数库: 这个库是由通用的.独立的.不属于任何类的函数组成的.函数库继承自 C 语言. 面向对象类库: 这个库是类及其相关函数的集合. C++ 标准库包含了所有的 ...

  2. C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——遍历和删除

    相关环境和说明在<C++拾趣--STL容器的插入.删除.遍历和查找操作性能对比(Windows VirtualStudio)--插入>已给出.本文将分析各个容器中遍历和查找的性能.(转载请 ...

  3. C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——删除

    相关环境和说明在<C++拾趣--STL容器的插入.删除.遍历和查找操作性能对比(Windows VirtualStudio)--插入>已给出.本文将分析从头部.中间和尾部对各个容器进行删除 ...

  4. C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——遍历和查找

    相关环境和说明在<C++拾趣--STL容器的插入.删除.遍历和查找操作性能对比(ubuntu g++)--插入>已给出.本文将分析各个容器中遍历和查找的性能.(转载请指明出于breakso ...

  5. C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——删除

    相关环境和说明在<C++拾趣--STL容器的插入.删除.遍历和查找操作性能对比(ubuntu g++)--插入>已给出.本文将分析从头部.中间和尾部对各个容器进行删除的性能.(转载请指明出 ...

  6. STL容器存储的内容动态分配情况下的内存管理

    主要分两种情况:存储的内容是指针:存储的内容是实际对象. 看以下两段代码, typedef pair<VirObjTYPE, std::list<CheckID>*> VirO ...

  7. STL容器是否是线程安全的

    转载http://blog.csdn.net/zdl1016/article/details/5941330 STL的线程安全. 说一些关于stl容器的线程安全相关的话题. 一般说来,stl对于多线程 ...

  8. gdb 查看 stl容器 zz

    将下面文件作为 ~/.gdbinit的内容, 或者在已有的~/.gdbinit中source下面的文件, 然后可以以下列方式查看stl容器的数据:  容器类型 GDB 命令 std::vector&l ...

  9. 标准非STL容器 : bitset

    1. 概念 什么是"标准非STL容器"?标准非STL容器是指"可以认为它们是容器,但是他们并不满足STL容器的所有要求".前文提到的容器适配器stack.que ...

  10. c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件

    Vectors 包含着一系列连续存储的元素,其行为和数组类似.访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线 ...

最新文章

  1. 未来几年自动驾驶预测(下)
  2. db2关闭下一句sql的日志_MySQL性能管理及架构设计:SQL查询优化、分库分表
  3. Android开发--传感器介绍
  4. Springboot中使用jpa
  5. Python interview_python
  6. ASP.NET Core使用Nacos SDK访问阿里云ACM
  7. mybatis:在springboot中的配置
  8. creator 静态属性_CocosCreator cc.class声明类
  9. 宝塔php扩展fil_宝塔面板安装Redis给WordPress网站加速优化教程
  10. antd 能自适应吗_Antd表格滚动 宽度自适应 不换行的实例
  11. 捕捉Web页面子类错误堆栈中的信息
  12. CSS3 Transform变形(2D转换)
  13. mysql自助完成翻页代码_MySql实现翻页查询功能
  14. AIX ksh使用小技巧
  15. 移远NB-IOT BC28 模组 与自建的UDP服务器通信
  16. ibm服务器报错代码大全_IBM服务器错误代码大全
  17. 本科毕业论文多久能写完 计算机,论文初稿几天可以写完-你觉得十天时间能不能写完一篇本科毕业论文?为什么?...
  18. 述职答辩提问环节一般可以问些什么_述职提问环节应该提哪些关键问题?
  19. 《Web API 的设计与开发》读书笔记
  20. Nazo前三十三关攻略

热门文章

  1. abs包含在哪个头文件_C语言abs和labs函数详解和示例
  2. 无法修改计算机时间权限,无法修改系统时间怎么办
  3. 8080端口被占用如何杀掉进程
  4. Brocade switch upgrade firmware
  5. 教你如何用python把玩守望先锋新英雄
  6. Zabbix3.4监控Linux主机CPU温度
  7. 静态路由绑定探测组功能的配置
  8. OpenWrt设置开机自动启动/延迟启动
  9. 第一章 十天干,十二地支
  10. OPNsense - 多功能高可靠易使用的防火墙(一)