STL简介
标准模板库是一组模板类和函数,向程序员提供了:
- 用于储存信息的容器
- 用于访问容器储存的信息的迭代器
- 用于操作容器内容的算法
其中,容器又包含:
顺序容器
- std::vector——与动态数组类似,在最后插入数据。
- std::deque——与std::vector类似,允许在开头添加或删除数据。
- std::list——与双向链表类似。
- std::forward_list——类似于std::list,不过是单向链表。
关联容器
std::set——储存各不相同的值,在插入时进行排序。(对数复杂度)
std::unordered_set——c++11新增的,与set相同。(复杂度为常数)std::map——储存键值对,并根据唯一的键排序。(对数复杂度)
std::unordered_map——c++11新增的,与map相同。(复杂度为对数)std::multiset——与set类似,但值不需要是唯一的。
std::unordered_multiset——c++11新增的,与unordered_set类似。但值不需要是唯一的。std::multimap——与map类似,不要求键是唯一的。
std::unordered_multimap——c++11新增的,与unordered_map类似。不要求键是唯一的。
容器适配器
- std::stack:以LIFO(后进先出)的方式储存元素。
- std::queue:以FIFO(先进先出)的方式储存元素。
- std::priority_queue:以特定顺序储存元素。
- std::stack:以LIFO(后进先出)的方式储存元素。
下文再介绍时,省略了std::
STL迭代器
指针是最简单的迭代器,让该指针指向数组中的第一个元素,然后递增指针以获得下一个元素。
STL中的迭代器是模板类,在某种程度上,可以将它理解成泛型指针。
STL算法
为程序员提供的查找、排序、反转等功能的模板函数。
使用STL算法时,要包含标准头文件
常用STL算法如下:
- std::find: 在集合中查找值。
- std::find_if: 根据用户指定的谓词在集合中查找值。
- std::reverse: 反转集合中的元素的排序。
- std::remove_if: 根据用户定义的谓词将元素从集合中删除。
- std::transform: 使用用户定义的变换函数对容器中的元素进行变换。
使用迭代器在容器和算法之间交互
1 |
|
由上述代码可以看出,迭代器就是获得的是容器中元素的地址;因此,在某种程度上可以将它理解为泛型指针。
STL string类
std::stirng与std::wstring是STL库中一个帮助程序员用于字符串操作的容器类。使用时要包含
头文件。
以std::string为例来介绍这个类的用法。
- 实例化string
1 | const char* C_StyleString = "Hello String"; |
- 访问string的内容
1 | //通过[]访问元素 |
上面代码中使用迭代器时,使用了一个新的迭代器const_iterator,使用它时,迭代器的值可变,但迭代器指向的值的值不可被改变。
- 字符串拼接
使用+=或者成员函数append()来拼接字符串。
1 | string str4 = "Hello "; |
- 字符/子字符串查找
可以使用string中的成员函数find来查找字符或者子字符串。
查找成功返回字符的索引或子字符串首个字符的索引。
查找失败返回string::npos(实际值为-1)。
1 | string str6 = "Hello World"; |
size_t在32位架构上是4字节,在64位架构上是8字节,在不同架构上进行编译时需要注意这个问题。而int在不同架构下都是4字节;且int为带符号数,size_t为无符号数。
- 字符串截短
可以使用成员函数erase()来删除字符串中的字符。
使用方法如下:
1 | string myStr = "Life is always like this."; |
- 在给定偏移位置(索引值)和指定数目时删除字符。
1 | //删除索引在 区间[14,19) 内的字符串 |
- 删除迭代器iChar指向的字符。
1 | auto iChar = find(myStr.begin(), myStr.end(), '.'); |
- 删除两个迭代器指定范围内的字符串。
1 | myStr.erase(++myStr.begin(), myStr.end()); //L |
使用成员方法clear()时,经清楚全部内容并重置string对象。
- 字符串反转
使用泛型算法std::reverse()对字符串进行反转。(注意不是成员方法)
reverse接收两个参数,起始迭代器、终止迭代器,然后将对两个迭代器之间的内容进行反转。
1 | string myStr = "Life is always like this."; |
- 字符串大小写转换
使用算法std::transform()进行大小写转换。(注意不是成员方法)
transform(first, last, r_first, trans)接收四个参数:开始迭代器、终止迭代器、开始迭代器、要执行的变换。
要执行转大写操作时 trans = toupper, 要执行转小写操作时 trans = tolower。
1 | string myStr = "life is always like this."; |
如果要编写的应用程序需要更好的支持非拉丁字符,如中文与日文时,应使用std::wstring。