目录
一、STL基本概念
STL几乎所的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。
二、STL的六大组件
这六大容器分别是:容器、算法、仿函数、迭代器、适配器、空间配置器。
- 容器:存放数据
- 算法:操作数据
- 迭代器:算法通过迭代器操作容器数据
- 仿函数:为算法提供更多的策略
- 适配器:为算法提供更多的接口
- 空间适配器:为算法和容器 动态分配、管理空间
三、string容器常用操作
3.1 string 容器的基本概念
char * 是一个指针,string是一个类
string封装了char *,管理这个字符串,是一个char型的容器。
String封装了很多实用的成员方法:查找(find)、拷贝(copy)、替换(replace)、插入(insert)
不用考虑内存的释放和越界问题:string管理char *所分配的内存,每一次string的复制,取值都由string类负责维护,不用担心复制越界和取取值越界等。
3.2 string 容器常用操作
3.2.1 string 构造函数
string(); // 创建一个空字符串
string(const string & str); // 使用一个string对象初始化另一个string对象
string(const char* s); // 使用一个字符串s初始化
string(int n, char c); //使用n个字符串c初始化
3.2.2 string基本赋值操作
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(cosnt string &s); // 把字符串s赋给当前字符串
string& assign(int n, int c); // 用n个字符c赋给当前字符串
string& assign(const string &s, int start, int n); // 将s从start开始n个字符赋给当前字符串
3.2.3 string存取字符操作
char& operator[](int n); // 通过[]方式获取字符
char& at(int n); // 通过at方法获取字符
//[] 越界不会抛出异常 at方法 越界会抛出异常
3.2.4 string拼接字符操作
string& operatir+=(const string& str); // 重载+=操作符
string& opreator+=(const char* str); // 重载+=操作符
string& operator+=(const char c); // 重载+=操作符
string& append(const char *s); // 把字符串s连接到当前字符串的结尾
string& append(const char *s, int n); // 把字符串s的前n个字符串连接到当前字符串结尾
string& append(const string &s); // 同operator+=()
string& append(const string &s, int pos, int n); // 把字符串中从pos位置开始的n个字符连接到当前字符串·结尾
string& append(int n, char c); // 载当前字符串结尾添加n个字符c
3.2.5 string查找和替换
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); // 查找字符串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); // 从pos查找s的前n个字符最后一次出现的位置
int rfins(const char c, int pos); // 查找字符c最后一次出现的位置
string& replace(int pos, int n, const string& str); // 替换从pos开始n各字符为字符串str
string& replace(int pos, int n, const char* s); // 替换从pos开始的n各字符为字符串
3.2.6 string比较操作
/*
compare函数在>时返回 1, <时返回 -1, ==时返回 0
比较区分大小写,比较时参考字典顺序,排越前面的越小
大写的A比小写的a小
*/
int compare(const string &s)const; // 与字符串s比较
int compare(const char *s)const; // 与字符串s比较
3.2.7 string子串
string substr(int pos = 0, int n =npos)const; //返回由pos开始的n个字符组成的字符串
3.2.8 string插入和删除操作
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个字符
3.2.9 string和c-style字符串转换
// string 转 char*
string str = "itcast";
const char* cstr = str.c_str();
// char* 转 string
char* s = "itcast";
string str(s);
3.3 vector容器
3.3.1 vector容器概述
vector的数据安排及操作方式,与array非常相似,两者的唯一差别在于空间运用的灵活性。Array是静态空间,一旦配置了就不能改变,要换大一点或者小一点的空间,可以,一切琐碎的由自己来,首先配置一块新的空间,然后将旧的空间的数据搬往新空间,再释放原来的空间。Vector是动态空间,随着元素的加入,它的内部机制会自动扩充空间以容纳新元素。因此,vector的实现技术,关键在于其对大小的控制以及重新配置时的数据移动效率,一旦vector旧空间满了,如果客户每新增一个元素,vector内部知识扩充一个元素的空间,实为不智。
v.begin():获取容器的起始迭代器(指向第0个元素)
v.end():获取容器的结束迭代器(指向最后一个元素的下一个位置)
3.3.2 Vector的数据结构
3.3.3 vector构造函数
vector<T> v; // 采用模板实现类实现,默认构造函数
vector(v.begin(), v.end()); // 将v[begin(), end()]区间中的元素拷贝给本身
vector(n, elem); // 构造函数将n个elem拷贝给本身
vector(const vector & vec); //拷贝构造函数
3.3.4 vector常用赋值操作
assign(begin, end); // 将[begin, end)区间中的数据拷贝赋值给本身
assign(n, elem); // 将n个elem拷贝赋值给本身
vector& operator=(const vector &vec); // 重载等号操作符
swap(vec); //将vec与本身的元素互换
3.3.5 vector大小操作
size(); //返回容器中元素的个数
empty(); //判断容器是否为空
resize(int num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除
resize(int num, elem); //重新指定容器的长度为num, 若容器边长,则以elem值填充新位置,如果容器变短,则末尾超出容器部分被删除
capacity(); //容器的容量
reserve(int len); //容器预留 len个元素长度,预留位置不初始化,元素不可访问
3.3.6 插入和删除元素操作
insert(const_iterator pos, int count, ele); //迭代器指向位置pos插入count个元素
push_back(ele); //尾部插入元素ele
pop_back(); //删除最后一个元素
erase(const_iterator start, const_iterator end); //删除迭代器从start到end之间的元素
erase(const_iterator pos); // 删除迭代器指向的元素
clear(); //删除容器中所有元素
3.3.7 巧用swap收缩内存空间
vector<int> v1;
v1.reserve(1000);
v1.push_back(10);
v1.push_back(10);
v1.push_back(10);
v1.push_back(10);
cout<<"容量:"<<v1.capacity()<<", 大小:"<<v1.size()<<endl; // 1000 4
// resize只能修改大小,不能修改容量
// v1.resize(4);
vector<int>(v1).swap(v1);
cout<<"容量:"<<v1.capacity()<<", 大小:"<<v1.size()<<endl; // 4 4
3.4 deque容器
3.4.1 deque基本概念
vector容器时单向开口的连续内存空间,deque则是一种双向开口的连续线性空间。所谓双向开口,意思就是可以再头尾两端分别做元素的加入和删除操作,当然,vector容器也可以再头尾两端插入元素,但是在其头部操作效率奇差,无法被接收。
3.4.1 deque构造函数
deque<T> depT; //默认构造形式
deque(begin, end); // 构造函数将[begin, end)区间和zoo那个的元素拷贝给本身
deuqe(n, elem); // 构造函数将n个elem拷贝给本身
deque(const deque *deq); //拷贝构造函数
3.4.2 deque赋值操作
assign(begin, end); //将[begin,end)区间的数据拷贝赋值给本身
assign(n, elem); //将n个elem拷贝赋值给本身
deque& operator=(const deque &deq); //重载等号操作符
swap(deq); //将dep与本身的元素互换
3.4.3 deque大小操作
deque.size(); //返回容器中元素的个数
deque.empty(); //判断容器是否为空
deque.resize(num); //重新指定容器的长度为num, 若容器边长,则以默认值填充新位置,如果容器变短,则末尾超出容器长度元素将被删除
deque.resize(num, elem); //重新指定容器的长度为num, 若容器边长,则以elem值填充新位置,如果容器变短,则末尾超出容器长度元素将被删除
3.4.4 deque双端插入和删除操作
push_back(elem); //在容器尾部添加一个数据
push_front(elem); //在容器头部添加一个数据
pop_back(); //删除容器最后一个数据
pop_front(); //删除容器第一个数据
3.4.5 deque数据存取
at(idx); //返回索引idx所指的数据,如果idx越界,抛出cout_of_range
operator[]; //返回索引idx所指的数据,如果idx越界,不抛出异常,直接出错
front(); //返回第一个数据
back(); //返回最后一个数据
3.4.6 deque插入操作
insert(pos, elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置
insert(pos, n, elem); //在pos位置插入n个elem数据,无返回值
insert(pos, beg, end); //在pos位置插入[begin, end)区间的数据,无返回值
3.4.7 deque删除操作
clear(); //移除容器中的所有元素
erase(begin, end); //删除[begin, end)区间的数据,返回下一个数据的位置
erase(pos); //删除pos位置的数据,返回下一个数据的位置
3.5 stack容器
3.5.1 stack的基本概念
stack是一种先进后厨的数据结构,它只有一个出口,形式如图所示。stack容器允许新增元素,移除元素,取得栈顶元素,但是除了最顶端外,没有任何其他方法可以存取stack的其他元素。换言之,stack不允许遍历行为。由元素推入栈的操作成为push,将元素推出stack的操作称作pop.
3.5.2 stack构造函数
stack<T> stkT; //stack 采用模板类实现, stack对象默认构造方式
stack(const stack &stk); //拷贝构造函数
3.5.3 stack赋值操作
stack& operator=(const stack &stk); //重载等号操作符
3.5.4 stack数据存取操作
push(elem); //向栈顶添加元素
pop(); //从栈顶移除元素
top(); //返回栈顶元素
3.5.5 stack大小操作
empty(); // 判断堆栈是否为空
size(); //返回堆栈的大小
3.6 queue容器
3.6.1 queue基本概念
Queue是一种先进先出的数据结构。它有两个出口,queue容器允许从一段新增元素,从另一端移除元素。
3.6.2 queue常用的API
queue<T> queT; //queue采用模板类实现,queue对象的默认构造形式
queue(const queue &que); //拷贝构造函数
push(elem); //往队尾中添加一个元素
pop(); //从队头移除一个元素
back(); //返回最优一个元素
front(); //返回第一个元素
queue& operator=(const queue &qye); //重载等号操作符
empty(); //判断队列是否为空
size(); //返回队列的大小