STL简介:

STL(Standard Template Library,标准模版库)以模板类和模版函数的形式为程序员提供了各种数据结构和算法的实现,程序员通过利用STL,可以在代码空间、执行时间和编码效率上获得极大的好处。

STL大致可以分为三大类:算法(algorithm)、容器(container)、迭代器(iterator)。

在C++标准中,STL被组织为以下的一组头文件(注意,是没有.h后缀的!): 
algorithm/deque/functional/iterator/list/map/memory/numeric/queue/set/stack/utility/vector

.队列(queue先进先出)

简介:先进先出(FIFO)的线性表

1.使用方法
    头文件:#include <queue>

普通声明:queue <int> q;

特殊声明:(结构体)

 struct node
{
int x,y;
};
queue <node> q;

(后面其他STL的声明以T代表数据类型)

2.基本操作

1.push()   在末尾加入一个元素
    2.pop()     删除第一个元素
    3.front()    返回第一个元素 
    4.back()    返回最后一个元素 
    5.empty()  如果队列为空则返回真
    6.size()     返回队列中元素的个数

.优先队列(priority_queue

简介:优先队列具有最高级先出[first in,largest
out]的行为特征

1.使用方法:

头文件:#include <queue>

声明:priority_queue <T> p_que;  /* 默认从大到小排序 */

priority_queue <
T,vector<T>,greater<T> >  /*从小到大排序,greater改成less为从大到小排序*/

对于优先队列里元素为一个结构体类型,可对比较函数进行重载,使其按照某一个属性排序

2.基本操作

1.push()    加入一个元素
    2.pop()     删除优先级最高的元素(队顶元素)
    3.top()      返回优先队列中优先级最高的元素(队顶元素)
    4.size()    返回优先队列中元素的个数
    5.empty() 如果优先队列为空则返回真

优先队列时间复杂度:Ologn

通过友元函数进行运算符重载:(优先队列默认从大到小排,所以 '<' 代表的是从大到小,比较特殊!)

 struct node{
int x;
int y;
friend bool operator < (node n1,node n2){
return n1.x < n2.x; //"<"为从大到小排列,">"为从小到大排列。
}
};

.双向队列(deque)

简介:顾名思义,双向

1.使用方法

头文件:#include <deque>

声明:deque <T> d_q;

2.基本操作

1.front()          返回第一个元素
    2.back()          返回最后一个元素
    3.pop_back()   删除尾部的元素
    4.pop_front()    删除头部的元素
    5.push_back()  在尾部加入一个元素
    6.push_front()   在头部加入一个元素
    7.size()             返回双向队列中元素的个数
    8.clear()            删除所有元素
    9.empty()          如果双向队列为空则返回真

.集合(set)

简介:集合是实现了红黑树的平衡二叉检索树的一种数据结构。集合的互异性:同一个集合中的元素是互不相同的(敲黑板!)

1.使用方法

头文件:#include <set>

声明:set <T> s;

2.基本操作

1.begin()      返回第一个元素的地址
    2.end()         返回最后一个元素的下一个位置的地址
    3.insert(key) 插入键值key
    4.erase(key) 删除键值key的值
    5.erase(it)     删除定位器it指向的值(指定地址)
    6.find(x)         返回找到x的位置,如果没找到返回end()的位置。
    7.count(key) 返回集合中key值的个数,其实就是判断有无的另一种方法。
    8.lower_bound(x)返回不小于x的第一个数的位置,在set自动排序的基础上去使用,非常方便。
    9.upper_bound(x)返回大于x的第一个数的位置,在set自动排序的基础上去使用,非常方便。
   10.clear()  删除所有元素
   11.empty() 如果集合为空则返回真
   12.size()    返回集合拥有的元素个数

set默认从小到大排序。

迭代器:(容器都能使用)

 set <int> ::iterator it; //定义前向迭代器
for(it=s.begin();it!=s.end();it++)
cout<<*it<<endl;

.多重集合(multiset)

简介:性质和使用方法与set基本相同。特别的是多重集合无set的互异性。

1.使用方法

头文件:#include <set>

声明:multiset <T> m_s;

2.基本操作与set相同

在multiset中的erase()的功能比较特别:(特好用的一个特性)

erase(it) 删除定位器it指向的值(指定地址) /* it为地址 */

erase(x) 删除集合里面所有的x /* x为具体的值 */

.栈(stack后进先出)

简介:栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。(以 ''后进先出'' 为原则)

1.使用方法

头文件:#include <stack>

声明:stack <T> sta;

2.基本操作 (栈基本操作虽然少,但是栈的特性超级无敌好用!)

1.top() 返回最后一个元素
    2.pop() 删除最后一个元素
    3.push() 在末尾加入一个元素
    4.empty() 如果栈为空则返回真
    5.size() 返回栈中元素的个数

.映射(map

简介:map为从键(key)到值(value)的映射。并且map提供'' [] ''运算符,使得map可以像数组一样使用,因此map也称为''关联数组''。(非常好用的一种STL)

举个栗子:例如可以用一个map<string,
int> month_name 来表示“月份名字到月份编号”的映射,然后用month_name["July"] = 7 这样的方式来赋值。

1.使用方法

头文件:#include <map>

声明:map <T1,T2> m;

2.基本操作

1.insert() 插入元素

2.empty() 如果映射为空则返回真

3.size() 返回映射中元素的个数

4.erase() 删除元素

5.clear() 清空

经验之谈:对于map,我基本上都拿来当数组用的。有时候数组下标无法定到题目中要求的,可以用映射解决。map的初始值为0或空。map
<string,int> m;此时如果m["July"]没有赋值,那么m["July"]=0。同理map <int,string> m; m[1]没有赋值的话,m[1]='''';

.lower_bound函数与upper_bound函数

简介:二分函数( 时间复杂度 O(logn) )

  lower_bound():前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置

  upper_bound():前闭后开区间进行二分查找,返回大于val的第一个元素位置

1.使用方法

头文件:#include <algorithm>

使用前提:非降序列

举个栗子:

 #include <iostream>
#include <algorithm>
using namespace std; int main(){
int a[]={,,,,};
int pos=lower_bound(a,a+,)-a;
cout<<pos<<endl;//pos=3,a[3]=5.
return ;

扩展使用:nlogn的(最长不降子序列),upper_bound()

注意:lower_bound()里面的前两个代表的分别是首地址和(首地址+数组长度)。

.不定长数组(vector

简介:vector是同一种对象的集合,每个对象都有一个对应的整数索引值。(简单来说就是不定长数组)

1.使用方法

头文件:#include <vector>

声明:vector <T> v;

2.基本操作

 0.以下标的形式访问容器中的元素:v[i]

1.向量大小: vec.size();

2.向量判空: vec.empty();

3.末尾添加元素: vec.push_back();

4.末尾删除元素: vec.pop_back();

5.访问第一个元素: vec.front();

6.访问最后一个元素: vec.back();

7.元素翻转:reverse(vec.begin(), vec.end());

8.sort(vec.begin(), vec.end()); //采用的是从小到大的排序

vector可用于邻接表存图之类的。

.对组(pair

简介:表示一个二元组或元素对

1.使用方法

头文件:#include <pair>

声明:pair <T,T> p;

2.基本操作

访问第一个元素:p.first

访问第二个元素:p.second

十一.字符串(string

简介:字符串是程序中经常要表达和处理的数据,我们通常采用字符数组或字符指针表示字符串。STL为我们提供了另一种使用起来更为便捷的字符串的表达方式:string。string类的定义在头文件<string>中。

1.使用方法

头文件:#include <string>

声明:string s;

2.基本操作

0.以下标的形式访问字符串中的元素:s[i]

1.字符串拼接:+

2.判断字符串s是否为空:s.empty()

3.返回字符串s里字符个数:s.size()或s.length()

4.截取s字符串中从i开始长度为len的子串:s.substr(i,len)

5.元素翻转:reverse(s.begin(), s.end());

6.查找第一个出现的字符串”cat“,返回其下标值,查不到返回 4294967295(npos),也可查找字符:s.find ( "cat " ) ;

STL的相关知识的更多相关文章

  1. 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸

    类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...

  2. 移动WEB像素相关知识

    了解移动web像素的知识,主要是为了切图时心中有数.本文主要围绕一个问题:怎样根据设备厂商提供的屏幕尺寸和物理像素得到我们切图需要的逻辑像素?围绕这个问题以iphone5为例讲解涉及到的web像素相关 ...

  3. listener监听器的相关知识

    从别人的博客上我学习了listener的相关知识现在分享给大家 1.概念: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上 ...

  4. UIViewController相关知识

    title: UIViewController 相关知识date: 2015-12-13 11:50categories: IOS tags: UIViewController 小小程序猿我的博客:h ...

  5. 【转】java NIO 相关知识

    原文地址:http://www.iteye.com/magazines/132-Java-NIO Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的 ...

  6. NSString使用stringWithFormat拼接的相关知识

    NSString使用stringWithFormat拼接的相关知识 保留2位小数点 1 2 3 4 //.2代表小数点后面保留2位(2代表保留的数量) NSString *string = [NSSt ...

  7. iOS网络相关知识总结

    iOS网络相关知识总结 1.关于请求NSURLRequest? 我们经常讲的GET/POST/PUT等请求是指我们要向服务器发出的NSMutableURLRequest的类型; 我们可以设置Reque ...

  8. 电路相关知识--读<<继电器是如何成为CPU的>>

    电路相关知识–读<<继电器是如何成为CPU的>> */--> *///--> *///--> 电路相关知识–读<<继电器是如何成为CPU的> ...

  9. 地址标记,SpringMVC转发与调用相关知识存档

    1.mytest_mavenprj1中,index的 <a href="login/login.html">点击登录</a> 与 <a href=&q ...

随机推荐

  1. 学习yii2.0——依赖注入

    依赖注入 依赖注入是一种设计模式,可以搜索“php依赖注入”,这里不阐述了. yii框架的依赖注入 Yii 通过 yii\di\Container 类提供 DI 容器特性. 它支持如下几种类型的依赖注 ...

  2. 让Apache和Nginx支持php-fpm模块

    Apache 对于Apache,首先是apache的安装,可以参考下面这篇博客:编译安装Apache 编辑apache配置文件,取消下面这两行的注释(删除前面的#): #LoadModule prox ...

  3. marMariaDB & MYSQL flexviews

    Using Flexviews - part one, introduction to materialized views - Percona Database Performance Bloght ...

  4. nginx之快速查找配置文件

    nginx的配置放在nginx.conf文件中,一般我们可以使用以下命令查看服务器中存在的nginx.conf文件.   locate nginx.conf /usr/local/nginx/conf ...

  5. 图片转字符画 【学习ing】

    1.创建ascii.py 2. 下面是 ascii.py 的完整代码: from PIL import Image import argparse #命令行输入参数处理 parser = argpar ...

  6. 测试python最大递归层次

    转自:https://www.cnblogs.com/xiongdashuai/p/6243372.html python默认的最大递归层数: 运行环境:Windows 7,x64python环境:p ...

  7. laravel添加model文件夹,需要改动的地方

    首先,将app\User(等model文件),移入APP\modellists文件夹中,方便整理 第二,修改模型中命名空间和引用其他model的路径 第三,将文件夹app\admin中的控制器文件,全 ...

  8. Ubuntu18.04安装mysql5.7

    Ubuntu18.04安装mysql5.7 1.1安装 首先执行下面三条命令: # 安装mysql服务 sudo apt-get install mysql-server # 安装客户端 sudo a ...

  9. LAMP 版本查看

    mysql 1 在终端下执行 mysql -V 2  mysql --help |grep Distrib 3 在mysql 里查看 select version() 4 在mysql 里查看 sta ...

  10. mysql高可用架构之MHA,haproxy实现读写分离详解

    MySQL高可用架构之MHA 一.运维人员需要掌握的MySQL技术: 1.基本SQL语句 2.基本的管理[库表数据的管理    权限的管理] 3.容灾       保证数据不丢失. 二.工作中MySQ ...