STL-标准模板库
STL的诞生
- 长久以来,软件界一直希望建立一种可重复利用的东西
- c++的面向对象和泛型编程思想,目的就是复用性的提升
- 大多数情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复工作
- 为了建立数据结构和算法的一套标准,诞生了STL
STL基本概念
- STL(Standard Template Library)标准模板库
- STL 从广义上分为:容器(container)、算法(algorithm)、迭代器(iterator)
- 容器和算法之间通过迭代器进行无缝连接
- STL几乎所有的代码都采用了模板类或者模板函数
STL六大组件
六大组件分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器
- 容器:各种数据结构,如 vector、list、deque、set、map 等,用来存放数据
- 算法:各种常用的算法,如 sort、find、copy、for_each 等
- 迭代器:扮演了容器与算法之间的胶合剂
- 仿函数:行为类似函数,可作为算法的某种策略
- 适配器:一种用来修饰容器或者仿函数或迭代器接口的东西
- 空间配置器:负责空间的配置与管理
String 容器
基本概念
本质
- string 是 C++ 风格的字符串,而 string 本质上是一个类
string 和 char* 区别
- char* 是一个指针,通过这个指针管理一连串的 char 类型的空间
- string 是一个类,类内部封装了 char*,管理这个字符串,是一个 char* 类型的容器
特点
string 类内部封装了很多成员方法
例如:查找 find,拷贝 copy,删除 delete,替换 replace,插入 insert
string 管理 char* 所分配的内存,不用担心复制越界和取值越界等问题,这些问题由类内部进行负责
构造函数
#include #include using namespace std; void test() { string s1; // 背后会调用默认的构造函数 const char* s2 = "hello world"; // C语言风格的字符串 string s3(s2); // 背后会调用拷贝构造函数 cout string s1; s1 = "hello world"; cout test(); } string s1 = "我"; s1 += "爱唱歌"; // 追加字符串 s1 += 'a'; // 追加一个字符 string s2 = "666"; s1 += s2; string s3 = "I"; s3.append(" Love "); s3.append("game abcde", 4); // 只追加前面4个字符 cout test(); } for (vector cout // 容器1 vector v1.push_back(i); } printVector(v1); // 0 1 2 3 4 5 6 7 8 9 // 容器2 vector v2.push_back(i); } printVector(v2); // 10 9 8 7 6 5 4 3 2 1 // 交换容器 /* v1 指向 容器1 v2 指向 容器2 ------------ 交换容器之后 ------------ v1 指向 容器2 v2 指向 容器1 */ v1.swap(v2); printVector(v1); // 10 9 8 7 6 5 4 3 2 1 printVector(v2); // 0 1 2 3 4 5 6 7 8 9 } void test2() { // 交换容器的实际应用:巧用swap可以收缩空间内存 // 1. 创建一个vector容器 vector v.push_back(i); } cout test1(); test2(); } for (deque cout deque test(); } for (list cout // 创建list容器,并存入数据 list cout cout test(); } for (list cout list test(); } for (map cout // 默认构造 map test(); } for (map cout // 创建map容器 map cout cout test(); } cout public: void operator()(int val) { cout // 创建容器 vector v.push_back(i); } // 遍历数据 for_each(v.begin(), v.end(), print); for_each(v.begin(), v.end(), MyPrint()); // MyPrint() -- 匿名函数对象 } int main() { test(); }
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。