您的位置:首页 > 其它

STL语句

2017-10-08 21:16 20 查看
STL从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),容器和算法通过迭代器可以进行无缝地连接。几乎所有的代码都采 用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。

STL的一个重要特点是数据结构和算法的分离。

1、容器:用来管理一组数据,下面介绍几种常用的容器

1)string:string是STL的字符串类型,通常用来表示字符串。它是一个类,封装了char*,它不用考虑内存的释放与越界,还提供了一系列字符串操作函数:

首先,构造函数,有无参构造、拷贝构造和带参数构造:string s1  、  string s2(s1) 、 string("abc") 、 string(4,a)  ,这些构造方式都是支持的。

其次,有一些其他函数,如:取字符[ ] 和 at () 、取长度length () 、 连接+和+= 、 复制 = 和copy() 、 比较 compare() 、查找 find () 、插入 insert () 、删除 erase ()

2)vector:vector是将元素置于一个动态数组中加以管理的容器。同样,它也是模板类的封装,默认构造形式是这样的:vector<T> vecT;  T就是数组内部存放的数据类型

它的一些函数有:开头元素a.front() 、  末尾元素a.back() (它俩的返回值是引用,可以作为左值)、判空a.empty()  、 抛出 a.pop_back()  、添加元素a.push_back()

和之前string类似,[ ] 和at () 也是支持的。删除的话,需要通过迭代器删除,返回的是下一个元素的迭代器,不过有清空函数 a.clear() ;

3)deque:双端数组,类似vector的用法,deque<T> deqT  

区别就在于它是双端的,有d.push_back() 、 d.push_front() 、 d.pop_back() 和 d.pop_front() 四种。

4)其他容器,像栈、队列是没有迭代器的,表list是双向链表

ls.erase(ls.begin()); 		// 表不支持随机访问
ls.remove(2);	 		// 以值的方式删除
ls.reverse();			// 表的逆序

优先级队列:是有序队列,默认从大到小
priority_queue<int> q;
priority_queue<int,vector<int>,greater<int>> q;     //最小值优先

5)set:set 容器中的数据是唯一的,相同数据无法插入。内部排序从小到大

当我们需要存放自定义类型时,编译器不知道怎么对自定义类型排序,所以需要重载()运算符,用来比较自定义类的大小:

bool operator() ( const STU s,const STU s2);


2、迭代器:iterator,通常用来遍历,it 类似指针,用来指向容器中某一元素,可进行++操作

vector<int> :: iterator it;
for(it = a.begin; it != a.end(); )	// 考虑到返回值问题,it指向下一个元素,所以通常使用while比较好用
{
it = a.erase(it);
}


反向迭代器:

vector<int>::reverse_iterator rit;
for ( rit = a.rbegin(); rit != a.rend(); rit++)
{
cout << *rit << " ";
}


3、算法:算法,是求解问题类的、机械的、统一的方法,常用于计算、数据处理和自动推理。可以理解为有基本运算及规定的运算顺序所构成的完整的解题步骤。它是由一大堆模版函数组成的,可以认为每个函数在很大程度上 都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: