STL概述及常用容器
STL知识点总结(二)
C++学习总结: 快速跳转
1. STL
1.1 初识
- 标准模板库(Standard Template Library,STL)
- STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器)
- 容器和算法之间通过迭代器进行无缝连接
- STL中几乎所有的代码都采用了**模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用**机会。
1.2 STL六大组件
容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器
- 容器:各种数据结构,如vector、list、deque、set等
- 算法:各种常用的算法,sort、find、copy、for_each等
- 迭代器:容器与算法之间的胶合剂
- 仿函数:行为类似于函数,可用作为算法的某种策略
- 适配器:一种用来修饰容器或者仿函数或迭代器接口的东西
- 空间适配器:负责空间的配置与管理
1.3 STL中的容器、算法、迭代器
1 . 容器
- 将一些数据结构实现出来
- 分为两种
- 序列式容器:强调值得排序,每个元素中均有固定的位置
- 关联式容器:二叉树结构,各元素之间没有严格的物理上的顺序关系
- 算法
- 质变算法:指运算过程中会更改区间内的元素的内容。拷贝、删除、替换等
- 非质变算法:运算中不会更改区间内的元素内容,查找、技术、遍历等
- 迭代器
- 提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表述方式
- 每个容器都有自己的专属迭代器(类似于指针)
- 迭代器种类
种类 | 功能 | 支持运算 |
---|---|---|
输入迭代器 | 只读 | 支持++、==、!= |
输出迭代器 | 只读 | 支持++ |
前向迭代器 | 读写,并能向前推进迭代器 | 支持++、==、!= |
双向迭代器 | 读写,并能向前和向后操作 | 支持++、– |
随机访问迭代器 | 读写 ,可以跳跃访问任何数据,功能最强 | 支持++、–、[n]、-n、<、<=、>、>= |
常用的容器中迭代器种类为双向迭代器,和随机访问迭代器
2. 常用容器
2.1 string 容器
2.1.1 基本概念
- string是C++风格的字符串,本质上是一个类
- string与char*的区别
- char* 是一个指针
- string是一个类,内部封装了char*,管理字符串,是一个char*型的容器
- 特点
- 类内封装了很多成员方法
- 例如:查找find,拷贝copy,删除delete 替换replace,插入inser
- string管理char*所分配的内存,不用担心复制越界和取值越界,由类内部进行负责
2.1.2 string的构造函数
函数原型:
string(); //创建一个字符空串,string str;
string(const char* s); //使用字符串s初始化
string(const string& str); //使用一个string对象初始化
string(int n,char c); //使用n个字符初始化
#include <string>//要包含的头文件
//创建空字符串,调用无参构造
string s1;
//使用字符串初始化
const char* str = "hi baby!!!";
string s2(str);
//使用一个string对象初始化
string s3(s2);
//使用n个字符初始化
string s4(10,'b');
2.1.3 赋值操作
函数原型 | 说明 |
---|---|
string& operator=(const char* s) |
char*类型字符串,赋值给当前字符串 |
string& operator=(const string &s) |
字符串s赋值给当前字符串 |
string& operator=(char c) |
字符赋值给当前字符串 |
string& assign(const char* s) |
字符串赋值给当前字符串 |
string& assign(const string& s) |
字符串s赋值给当前字符串 |
string& assign(const char* s,int n) |
字符串前n个字符赋值给当前字符串 |
string& assign(int n,char c) |
n个字符c赋值给当前字符串 |
operator=
比较实用
const char*s = "hello,baby!!!";
string s1 = s;
string s2 = s1;
string s3 = 'c';
string s4;
s4.assign(s);
s4.assign("hello",2);
s4.assign(s1);
s4.assign(3,'a');
2.1.4 字符串拼接
函数原型 | 说明 |
---|---|
string& operator+=(const char* s) |
重载+=操作符 |
string& operator+=(const string &s) |
重载+=操作符 |
string& operator+=(char c) |
重载+=操作符 |
string& append(const char* s) |
字符串s连接到当前字符串结尾 |
string& append(const string& s) |
|
string& append(const char* s,int n) |
字符串前n个字符连接到当前字符串结尾 |
string& append(const string& s,int pos,int n) |
字符串s中从pos开始的n个字符连接到当前字符串结尾 |
string s1 = "hello";
s1 += "world";
s1 += ':';
string s2 = "!!!";
s1 += s2;
cout << s1 << endl;
string s3 = "I";
s3.append(" love ");
s3.append("youahdhdjjdjdjd",3);
s3.append(str1,1,4);
2.1.5 查找与替换
函数原型 | 说明 |
---|---|
int find(const string& str, int pos = 0) const; |
查找str第一次出现位置,从pos开始查找 |
int find(const char* s, int pos = 0) const; |
查找s第一次出现位置,从pos开始查找 |
int find(const char* s, int pos, int n) const; |
从pos位置查找s的前n个字符第一次位置 |
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 |
- find查找是从左往后,rfind从右往左
- find找到字符串后返回查找的第一个字符位置,找不到返回-1
- replace在替换时,要指定从哪个位置起,多少个字符,替换成什么样的字符串
string str;
str.find(参数);
str.