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

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

SGI -- Silicon Graphics[Computer System] Inc.硅图[计算机系统]公司.

STL -- Standard Template Library标准模板库。

容器的概念

所谓STL容器,即是将最常运用的一些数据结构(data structures)实现出来。

容器是指容纳特定类型对象的集合。根据数据在容器中排列的特性,容器可概分为序列式(sequence)和关联式(associative)两种。

迭代器是一种检查容器内元素并遍历元素的数据类型。它提供类似指针的功能,对容器的内容进行走访。

#include

例如:

std::vector IntVector;

std::vector ::iterator first=IntVector.begin();

// begin()得到指向vector开头的Iterator,*first得到开头一个元素的值

std::vector ::iterator last=IntVector.end();

// end()得到指向vector结尾的Iterator,*last得到最后一个元素的值

序列式容器

所谓序列式容器,其中的元素都可序(ordered),但未必有序(sorted)。数组为C++语言内置的序列容器,STL另外提供vector、list、deque(double-ended queue)。它们的差别在于访问元素的方式,以及添加或删除元素相关操作的运行代价。

标准库还提供了三种容器适配器(adapter),所谓适配器是根据原始的容器类型所提供的操作,通过定义新的操作接口,来适应基础的容器类型。顺序容器适配器包括stack、queue、priority_queue等序列式容器。其中stack和queue由于只是将deque改头换面而成,技术上被归类为一种配接器(adapter),priority_queue是有优先级管理的队列。

一. Vector

1.vector的基本概念

vector是标准C++建议替代C数组的动态数组模型,它维护的是一个连续线性空间。

vector所采用的数据结构非常简单:线性连续空间。它以两个迭代器start和finish分别指向配置得到的连续空间中目前已被使用的范围,并以迭代器end_of_storage指向整块连续空间(含备用空间)的尾端。

vector的实现技术,关键在于其对大小的控制以及重新分配时的数据移动效率。一旦vector原有空间用完,如果客户端每新增一个元素,vector内部就只扩充一个元素的空间,实为不智。因为所谓扩充控件(不论多大),是“配置新空间(malloc)/拷贝移动数据(memcpy)/释放旧空间(free)”的大工程,时间成本很高,应该采用某种未雨绸缪的空间配置策略。

注意,所谓动态增加大小,并不是在原空间之后接续新空间(因为无法保证之后尚有可供配置的空间),而是每次再分配原大小两倍的内存空间。因此,对vector的任何操作,一旦引起控件重新配置,指向原vector的所有迭代器就都失效了。

由于vector维护的是一个连续线性空间,因此vector迭代器具备普通指针的功能,支持随机存取,即vector提供的是Random Access Iterators。

2.向量类模板std::vector的成员函数

#include

std::vector vec;

std::vector vec(size);

std::vector vec(size,value);

std::vector vec(myvector);

std::vector vec(first,last);

Operators:==、!=、<=、>=、<、>、[]

assign(first,last):用迭代器first,last所指定的元素取代向量元素

assign(num,val):用val的num份副本取代向量元素

at(n):等价于[]运算符,返回向量中位置n的元素,因其有越界检查,故比[]索引访问安全

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

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

begin():返回向量中第一个元素的迭代器

end():返回向量中最后一个元素的下一个迭代器(仅作结束游标,不可解引用)

max_size():返回向量类型的最大容量(2^30-1=0x3FFFFFFF)

capacity():返回向量当前开辟的空间大小(<= max_size,与向量的动态内存分配策略相关)

size():返回向量中现有元素的个数(<=capacity)

clear():删除向量中所有元素

empty():如果向量为空,返回真

erase(start,end):删除迭代器start end所指定范围内的元素

erase(i):删除迭代器i所指向的元素

erase()返回指向删除的最后一个元素的下一位置的迭代器

insert(i,x);把x插入到迭代器i所指定的位置之前

insert(i,n,x):把x的n份副本插入到迭代器i所指定的位置之前

insert(i,start,end):把迭代器start和end所指定的范围内的值插入到迭代器i所指定的位置之前

push_back(x):把x推入(插入)到向量的尾部

pop_back():弹出(删除)向量最后一个元素

rbegin():返回一个反向迭代器,该迭代器指向的元素越过了向量中的最后一个元素

rend():返回一个反向迭代器,该迭代器指向向量中第一个元素

reverse():反转元素顺序

resize(n,x):把向量的大小改为n,新元素的初值赋为x

swap(vectorref):交换2个向量的内容

3.动态字符串类std::string

string是标准C++建议替代C字符串(以零结束的字符数组)的动态字符串模型,可以简单的看做vector

#include

std::string str1;

std::string str3(str2);

std::string str2("this is a string");

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

Operators:+、+=

length():和size()函数功能相同

data():取得字符串指针

c_str():取得C风格字符串指针

c_str()的流程是先调用terminate(),然后再返回data()。因此如果你对效率要求比较高,而且你的处理又不一定需要以/0的方式结束,最好选择data()。但是对于一般的C函数中,需要以const char*为输入参数,要使用c_str()函数。

operator=:赋值操作符

append():追加字符串

replace():替换字符

copy():拷贝自己的num个字符到str中(从索引index开始)。

find():在字符串中查找指定字符,返回基于0的索引号

rfind():反向查找

find_first_of():查找包含子串中的任何字符,返回第一个位置

find_first_not_of():查找不包含子串中的任何字符,返回第一个位置

find_last_of():查找包含子串中的任何字符,返回最后一个位置

find_last_not_of():查找不包含子串中的任何字符,返回最后一个位置