标志C++ 中STL 类的简单介绍(二)

2014-11-24 07:33:40 · 作者: · 浏览: 1

substr(n1,len):得到字符串从n1开始的长度为len的子串

比较字符串(支持所有的关系运算符)

compare比较字符串

operator+ 字符串衔接

operator+=增加操作符

operator==判断是否相等

operator!=判断是否不等于

operator<判断是否小于

operator>>从输入流中读入字符串

operator<<字符串写入输出流

getline从输入流中读入一行

二.list

1.list的基本概念

相对于vector的连续线性空间,list就显得复杂许多,与向量(vector)相比,它允许快速的插入和删除,且每次插入或删除一个元素,就配置或释放一个元素空间。因此,list对于空间的运用绝对的精准,一点也不浪费。而且,对于任何位置的元素插入或元素移除,list永远是常数时间。

list不再能够像vector那样以普通指针作为迭代器,因为其节点不保证在储存空间中连续存在。list迭代器必须有能力指向list的节点,并有能力进行正确的递增、递减、取值、成员存取等操作。所谓“list迭代器正确的递增、递减、取值、成员取用”操作是指,递增时指向下一个节点,递减时指向上一个节点,取值时取的是节点的数据值,成员取用时取用的是节点的成员。

list不仅是一个双向链表,而其还是一个环状双向链表。所以它只需要一个指针,便可以完整实现整个链表。由于list是一个双向链表(double linked-list),迭代器必须具备前移、后移的能力,所以list提供的是Bidirectional Iterators。

list有一个重要性质:插入操作(insert)和合并操作(splice)都不会造成原有的list迭代器失效。这在vector是不成立的,因为vector的插入操作可能造成记忆体重新配置,导致原有的迭代器全部失效。甚至list的元素删除操作(erase)也只有“指向被删除元素”的那个迭代器失效,其他迭代器不受任何影响。

2.链表类模板std::list成员函数

#include

std::list lst;

std::list lst(size);

std::list lst(size,value);

std::list lst(mylist);

std::list lst(first,last);

以下未列出与vector相同的通用操作。

push_front(x):把元素x推入(插入)到链表头部

pop_front():弹出(删除)链表首元素

merge(listref):把listref所引用的链表中的所有元素插入到链表中,可指定合并规则

splice():把lst连接到pos的位置

remove(val):删除链表中所有值为val的元素

remove_if(pred):删除链表中谓词pred为真的元素

(谓词即为元素存储和检索的描述,如std::less<>,std::greater<>那么就按降序/升序排列,你也可以定义自己的谓词)

sort():根据默认的谓词对链表排序

sort(pred):根据给定的谓词对链表排序

unique():删除链表中所有重复的元素

unique(pred):根据谓词pred删除所有重复的元素,使链表中没有重复元素

注意:vector和deque支持随机访问,而list不支持随机访问,因此不支持[]访问!

三.deque

1.deque的基本概念

vector是单向开口的连续线性空间,deque则是以中双向开口的连续线性空间。所谓双向开口,意思是可以在头尾两端分别做元素的插入和删除操作。从技术的角度而言,vector当然也可以在头尾两端进行操作,但是其头部操作效率奇差、令人无法接受。

deque和vector的最大差异,一在于deque允许于常数时间内对头端进行元素的插入或移除操作,二在于deque没有所谓容量(capacity)观念,因为它是动态地以分段连续空间组合而成,随时可以增加一段新的空间并链接起来。换句话说,像vector那样“因旧空间不足而重新配置一块更大空间,然后复制元素,再释放旧空间”这样的事情在deque中是不会发生的。也因此,deque没有必要提供所谓的空间预留(reserved)功能。

虽然deque也提供Random Access Iterator,但它的迭代器并不是普通指针,其复杂度和vector不可同日而语,这当然涉及到各个运算层面。因此,除非必要,我们应尽可能选择使用vector而非deque。对deque进行的排序操作,为了最高效率,可将deque先完整复制到一个vector身上,将vector排序后(利用STL的sort算法),再复制回deque。

deque是由一段一段的定量连续空间构成。一旦有必要在deque的前端或尾端增加新空间,便配置一段定量的连续空间,串接在整个deque的头端或尾端。deque的最大任务,便是在这些分段的定量连续空间上,维护其整体连续的假象,并提供随机存取的接口。避开了“重新配置、复制、释放”的轮回,代价则是复杂的迭代器架构。

2.双端队列类模板std::deque成员函数

#include

std::deque deq;

std::deque deq(size);

std::deque deq(size,value);

std::deque deq(mydeque);

std::deque deq(first,last);

其成员函数如下:

Operators:[]用来访问双向队列中单个的元素

front():返回第一个元素的引用

push_front(x):把元素x推入(插入)到双向队列的头部

pop_front():弹出(删除)双向队列的第一个元素

back():返回最后一个元素的引用

push_back(x):把元素x推入(插入)到双向队列的尾部

pop_back():弹出(删除)双向队列的最后一个元素

四.基于deque的顺序容器适配器stack、queue(priority_queue)

stack

1.stack的基本概念

stack是一种后进先出(First In Last Out,FILO)的数据结构,它只有一个出口。stack允许新增元素、移除元素、取得最顶端元素。但除了最顶端外,没有任何其他方法可以存取stack的其他元素,换言之,stack不允许随机访问。

STL以deque作为stack的底层结构,对deque封闭期头端开口,稍作修改便形成了stack。

将元素插入stack的操作称为push,将元素弹出stack的操作称为pop。stack所有元素的进出都必须符合“后进先出”的条件,只有stack顶端的元素,才有机会被外界取用。stack不提供走访功能,也不提供迭代器。

2.容器适配器堆栈类std::stack成员函数

#include

stack实现后进先出的操作

std::stack stk;

type为堆栈操作的数据类型

container为实现堆栈所用的容器类型,默认基于deque,还可以为std::vector和std::list

例如std::stack > IntStack;

其成员函数如下:

top():返回