强大的模板库——Standard Template Library
STL是Standard Template Library的简称,中文名标准模板库,惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL现在是C++的一部分,因此不用安装额外的库文件。
STL可分为容器(containers)、迭代器(iterators)、空间配置器(allocator)、配接器(adapters)、算法(algorithms)、仿函数(functors)六个部分。
C++ Iterators(迭代器)
迭代器可被用来访问一个容器类的所包含的全部元素,其行为像一个指针。举一个例子,你可用一个迭代器来实现对vector容器中所含元素的遍历。有这么几种迭代器如下:
迭代器 | 描述 |
---|---|
input_iterator | 提供读功能的向前移动迭代器,它们可被进行增加(++),比较与解引用(*) 。 |
output_iterator | 提供写功能的向前移动迭代器,它们可被进行增加(++),比较与解引用(*) 。 |
forward_iterator | 可向前移动的,同时具有读写功能的迭代器。同时具有input和output迭代器的功能,并可对迭代器的值进行储存。 |
bidirectional_iterator | 双向迭代器,同时提供读写功能,同forward迭代器,但可用来进行增加(++)或减少(–)操作。 |
random_iterator | 随机迭代器,提供随机读写功能.是功能最强大的迭代器, 具有双向迭代器的全部功能,同时实现指针般的算术与比较运算。 |
第种容器类都联系于一种类型的迭代器。第个STL算法的实现使用某一类型的迭代器。举个例子,vector容器类就有一个random-access随机迭代器,这也意味着其可以使用随机读写的算法。既然随机迭代器具有全部其它迭代器的特性,这也就是说为其它迭代器设计的算法也可被用在vector容器上。
提示:通过对一个迭代器的解引用操作(*)
,可以访问到容器所包含的元素。
栈(stack) 后进先出的值的排列
C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,——也就是说实现了一个先进后出FILO的数据结构。
bool empty();
如当前堆栈为空,empty()函数返回true否则返回false
void pop();
移除堆栈中最顶层元素
void push(const TYPE &val);
将val值压栈,使其成为栈顶的第一个元素
size_type size();
返回当前堆栈中的元素数目
void top();
返回对栈顶元素的引用
while (!s.empty())
{
cout << s.top() << " ";
s.pop();
}
vector向量
Vectors 包含着一系列连续存储的元素,其行为和数组类似。访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线性时间复杂度。
vector<type> v();创建一个空vector
vector<type> v(capacity);创建一个容量为capacity的vector
vector<type> v(capacity, val);每个元素值为val
void clear();
删除当前vector中的所有元素
size_type capacity();
返回v当前所具有的存储单元的容量
size_type size();
返回当前存储在v中的值的个数
bool empty();
当且仅当v不包含值时返回true
void push_back(cosnt TYPE &val);
添加value到v的尾部
void pop_back();
删除最后一个元素
TYPE front();
返回指向v的第一个元素的引用,注意这里是引用
TYPE back();
返回指向v的最后一个元素的引用,注意这里是引用,意味着可以修改
TYPE at(size_type loc);
返回下标为loc的元素
v1 = v2;将v2拷贝给v1
void swap(vector &from);
v1和v2交换内容
iterator begin();
返回一个指向当前vector起始元素的迭代器
iterator end();
返回一个指向当前vector末尾元素的下一个位置的迭代器,如果访问末尾元素需要自减1
erase(iterator loc);
删除指定位置的loc元素
erase(iterator start, iterator end);
删除区间[start,end)所有元素
iterator insert(iterator loc, const TYPE &val);
在指定位置loc插入值为value的元素,返回指向这个元素的迭代器
void insert(iterator loc, size_type num, const TYPE &val);
在指定位置loc插入num个值为val的元素
C++ Strings(字符串)
s和str是string,ca是一个字符数组,str_ca是一个字符串或者一个字符数组,str_ca_ch是一个字符串,一个字符数组或一个字符,ch是一个字符,n、n1、n2、pos1、pos2是整数。
string();
初始化一个空串
string(size_type length, char ch);
以length为长度的ch的拷贝
string(const char *str);
以str为初值
size_type capacity();
返回在重新申请更多的空间前字符串可以容纳的字符数
size_type size();
返回字符串中现在拥有的字符数。
size_type length();
函数返回字符串的长度. 这个数字应该和size()返回的数字相同。
size_type max_size();
函数返回字符串能保存的最大字符数。
basic_string &append(const basic_string &str);
在字符串的末尾添加str
basic_string &append(size_type num, char ch);
在字符串的末尾添加num个字符ch
iterator insert(iterator i, const char &ch);
在迭代器i表示的位置前面插入一个字符ch
basic_string &insert(size_type idnex, const basic_string &str);
在字符串的位置index插入字符串str
void swap(basic_string str);
把str和本字符串交换
basic_string substr(size_type index, size_type num = npos);
返回本字符串的一个子串从idnex开始,长num个字符,如果没有指定,将是默认值npos
reference at(size_type idnex);
返回对字符串s中位置i上的字符的引用,如果i越界的话会产生一个异常
iterator erase(iterator pos);
删除pos指向的字符,返回指向下一个字符的迭代器
iterator erase(iterator start, iterator end);
删除从strat到end所有的字符
size_type find(cosnt basic_string &str, size_type idnex);
返回str在字符串中第一次出现的位置(从idnex开始查找)
compare(str_ca1);
this < str;返回值小于0
this == str;返回值等于0
this > str;返回值大于0
empty();
如果字符串为空,返回真
iterator begin();
返回一个迭代器,指向第一个字符
iterator end();
返回一个迭代器,指向字符串的末尾