# 一、初识STL
- 建议一种可以重复利用的东西
- C++的面向对象和泛型编程的思想目的就是复用性的提升
- 多数情况下,数据结构和算法都没有一套标准,导致被迫从事大量的重复工作
- 为了建立数据结构和算法的一套标准,于是诞生了STL
# 1.1基本概念
STL全称为standard template library,标准模板库
STL从广义上可以分为:容器(container)、算法(algorithm)、迭代器(iterator)
容器和算法之间可以通过迭代器进行无缝连接
STL几乎所有的代码都采用了模板类和模板函数
# 1.2STL六大组件
- 容器:各种数据结构,如vector、list、deque、set、map等等,用于存放数据
- 算法:各种常用的算法,如sort、find、copy、for_each等等
- 迭代器:扮演了容器与算法之间的胶合剂
- 仿函数:行为类似函数,可以作为算法的各种策略
- 适配器:一种用来修饰容器或者放函数或者迭代器接口的东西
- 空间配置器:负责空间的配置和管理
# 1.3容器、算法和迭代器
# 1.3.1容器
容器:用于存放数据,将运用最广泛的一些数据结构实现出来
常用的数据结构有:数组、链表、树、栈、队列、集合、映射表等等
这些容器又被分为了序列式容器和关联式容器:
- 序列式容器:强调的是值的排序,序列式容器中每个元素均有固定的位置
- 关联式容器:二叉树结构,各个元素之间没有严格的物理上的顺序关系
# 1.3.2算法
算法:用于解决数据之间的处理逻辑,通过有限的步骤解决逻辑或数学上的问题
算法分为了质变算法和非质变算法:
- 质变算法:运算过程中会更该区间内元素间的内容,例如拷贝、替换、删除等等
- 非质变算法:指的是运算过程中不会更该区间内的元素内容,例如查找、计数、遍历、查找极值等等
# 1.3.3迭代器
迭代器:容器和算法之间的粘合剂,提供一种方法使之能够依序寻访某个容器中包含的各个元素,而不需要暴露该容器中内部的表现方式
每个容器都有自己专属的迭代器
迭代器的使用非常类似于指针,可以将迭代器理解为一种指针
常用的迭代器为双向迭代器和随机访问迭代器
# 二、string容器
# 2.1基本概念
本质:string
是C++风格的字符串,而string
本质上是一个类
string
和char*
的区别在于char*
是一个指针,另外string
是一个类,类的内部封装了char*
,用于管理这个字符串,是一个char*
型的容器
特点:string
类内部封装了很多成员方法,例如:查找,拷贝,删除,替换,插入等等
string
管理char*
所分配的内存,不用担心赋值越界和取值越界的问题,由类内部进行负责
# 2.2string构造函数
string();
创建一个空的字符串,例如:string str;string(const char* s);
使用字符串s进行初始化string(const string& str);
使用一个string对象初始化另一个string对象string(int n, char c);
使用n个字符c进行初始化
#include "iostream"
#include "string"
using namespace std;
int main() {
string str_01; // 默认构造
const char* str = "Hello World";
string str_02(str); // 使用字符串s进行初始化
cout << str_02 << endl;
string str_03(str_02); // 拷贝构造
cout << str_03 << endl;
string str_04(10, 'a'); // n个字符初始化
cout << str_04 << endl;
}
# 2.3string赋值
string& operator = (const char* s);
将char类型的字符串赋值给当前的字符串string& operator = (const string& s);
将字符串s赋值给当前的字符串string& operator = (char c);
字符赋值给当前的字符串string& assign(const char* s);
将字符串s赋值给当前的字符串string& assign(const char* s, int n);
将字符串s的前n个字符赋值给当前的字符串string& assign(const string &s);
将字符串s赋值给当前的字符串string& assign(int n, char c);
用n个字符c赋值给当前的字符串
#include "iostream"
#include "string"
using namespace std;
int main() {
string str_01;
str_01 = "Hello World";
cout << str_01 << endl;
string str_02;
str_02 = str_01;
cout << str_02 << endl;
str_01 = 'a';
cout << str_01 << endl;
str_01.assign("Hello Cpp");
cout << str_01 << endl;
str_01.assign("Hello Cpp", 5);
cout << str_01 << endl;
str_01.assign(str_02);
cout << str_01 << endl;
str_01.assign(10, 'a');
cout << str_01 << endl;
}
# 2.4字符串拼接
string& operatort += (const char* str);
重载+=操作符stringg operator += (const char c);
重载+=操作符string& operator += (const string& str);
重载+=操作符string& append(const char *s);
把字符串s连接到当前字符串结尾string& append(const char *s, int n);
把字符串s的前n个字符连接到当前字符串结尾string& append(const string &s);
同operator+=(const string& str)stringg append(const string &s, int pos, int n);
//字符串s中从pos开始的n个字符连接到字符串结尾
# 2.5查找与替换
查找:
int find(const string& str, int pos -e) const;
查找str第一次出现位置从pos开始查找int find(const char* s, int pos = 0) const;
查找5第一次出现位置,从pos开始查找int find(const char* s, int pos, int n) const;
从pos位置直找s的前几个字符第一次位置int find(const char c, int pos = 0) const;
查找字符c第一次出现位置int rfind(const string& str, int pos = npos) const;
查找str最后一次位置,从pos开始查找int rfind(const char* s, int pos = npos) const;
查s最后一次出现位置从pos开始查找int rfind (const char* s, int pos, int n) const;
从pos直找s的前n个字符最后一次位置int rfind(const char c, int pos = 0) const;
查找字符c最后一次出现位置
替换:
string& replace(int pos, int n, const string& str);
营换从pos开始n个字符为字符串strstring& replace(int pos, int n, const char* s);
替换从pos开始的n个字符为字符串s
# 2.6string字符串比较
字符串之间的比较按照字符串的ASCII码进行比较
相等则返回0,大于则返回1,小于返回-1
int compare(const string &s) const;
int compare(const char *s) const;
# 2.7字符获取
char& operator[](int n);
通过[]
的方式获取单个字符char& at(int n);
通过at方法获取单个字符
# 2.8插入与删除
string& insert(int pos, const char* s);
插入字符串string& insert(int pos, const string& str);
插入字符串string& insert(int pos, int n, char c);
在指定位置插入n个字符cstring& erase(int pos, int n = npos);
删除从Pos开始的n个字符
# 2.9截取子串
string substring(int pos = 0, int n = npos) const;
返回从pos开始的n个字符串组成的子串