C++学习笔记(八)

2021/12/29 C++

# 一、初识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迭代器

迭代器:容器和算法之间的粘合剂,提供一种方法使之能够依序寻访某个容器中包含的各个元素,而不需要暴露该容器中内部的表现方式

每个容器都有自己专属的迭代器

迭代器的使用非常类似于指针,可以将迭代器理解为一种指针

image-20211228145236939

常用的迭代器为双向迭代器和随机访问迭代器

# 二、string容器

# 2.1基本概念

本质:string是C++风格的字符串,而string本质上是一个类

stringchar*的区别在于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个字符为字符串str
  • string& 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个字符c
  • string& erase(int pos, int n = npos);删除从Pos开始的n个字符

# 2.9截取子串

  • string substring(int pos = 0, int n = npos) const;返回从pos开始的n个字符串组成的子串