一、STL初始
1.1 STL的六大组件
STL大体分为六大组件,分别是:容器、算法、迭代器、仿函数、适配器、空间配置器
- 容器:各种数据类型,比如vector、list、deque、set等等,用来存放数据
- 算法:各种常用的算法,比如sort、find、copy、for_each等等
- 迭代器:扮演了容器与算法之间的胶合剂
- 访函数:行为类型函数、可作为算法的某种策略
- 适配器:一种用来修饰容器或者仿函数或者迭代器接口的东西
- 空间配置器:负责空间的配制与管理
1.2 STL中的容器、算法、迭代器
容器:置物之所也
算法:问题之解法也
迭代器:容器与算法之间粘合剂
迭代器使用非常类似于指针,初学阶段我们可以先理解迭代器为指针
二、容器算法迭代器初始
2.1 vector存放数据
2.1.1 vector存放内置数据类型
容器:vector
算法:for_each
迭代器:vector<int>::iterator
vector的具体创建与尾插法以及遍历见下面代码
#include<iostream>
using namespace std;
#include<string>
#include<vector>
int main()
{
//创建了一个vector容器,类似数组
vector<int> v;
//尾插数据
v.push_back(10);
v.push_back(20);
v.push_back(30);
vector<int>::iterator itbegin = v.begin();//起始迭代器 指向容器中第一个元素
vector<int>::iterator itend = v.end();//结束迭代器 容器中最后一个元素的下一个位置
//第一种遍历方式
while (itbegin != itend)
{
cout << *itbegin << endl;
itbegin++;
}
return 0;
}
遍历方法不仅可以通过while循环来进行还可以使用for循环,详见下面代码
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *itbegin << endl;
}
第三种遍历方式 可以利用STL提供的遍历算法,还要记得添加#include<algorithm>
//第三张遍历方式
for_each(v.begin(), v.end(), pri);
void pri(int val)
{
cout << val << endl;
}
前两个参数是给确定区间,后面一个是一个函数,用的是一个函数回调的方法
三种遍历的整体源码:
#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<algorithm>
void pri(int val)
{
cout << val << endl;
}
int main()
{
//创建了一个vector容器,类似数组
vector<int> v;
//尾插数据
v.push_back(10);
v.push_back(20);
v.push_back(30);
vector<int>::iterator itbegin = v.begin();//起始迭代器 指向容器中第一个元素
vector<int>::iterator itend = v.end();//结束迭代器 容器中最后一个元素的下一个位置
//第一种遍历方式
while (itbegin != itend)
{
cout << *itbegin << endl;
itbegin++;
}
//第二种遍历方式
for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
{
cout << *itbegin << endl;
}
//第三张遍历方式
for_each(v.begin(), v.end(), pri);
return 0;
}
2.1.2 vector存放自定义数据类型
#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<algorithm>
class person
{
public:
person(string name,int age)
{
m_Name = name;
m_Age = age;
}
string m_Name;
int m_Age;
};
int main()
{
vector<person> v;
person p1("aaa", 10);
person p2("bbb", 10);
person p3("ccc", 10);
person p4("ddd", 10);
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);
//遍历容器中的数据
for (vector<person>::iterator it = v.begin(); it != v.end(); it++)
{
cout << "姓名:" << (*it).m_Name << "年龄" << it->m_Age << endl;
}
return 0;
}
通过相应的尖括号<>来给定容器即可
小技巧:注意迭代器(*it)其实就是相当于<>里面的东西
2.1.3 vector 容器嵌套容器
这个并不难,想想一下二维数组。
第一层的代表横坐标,第二层代表纵坐标,展开一个表格一样。
#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<algorithm>
int main()
{
vector<vector<int>> v;
//创建小容器
vector<int>v1;
vector<int>v2;
vector<int>v3;
//添加数据
for (int i = 0; i < 4; i++)
{
v1.push_back(i + 1);
v2.push_back(i + 2);
v3.push_back(i + 3);
}
//将小容器插入到大容器
v.push_back(v1);
v.push_back(v2);
v.push_back(v3);
//通过大容器 遍历所有的数据
for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++)
{
//(*it)===容器 vector<int>
for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); vit++)
{
cout << (*vit) << " ";
}
cout << endl;
}
return 0;
}
二、string容器
本质:
- string是C++风格的字符串,而string本质上是一个类
string和char*区别:
- char*是一个指针
- string是一个类,类内封装了char*,管理这个字符串,是一个char*型的容器
特点:
string类内部封装了很多成员方法
例如:查找find,拷贝copy,删除delete,替换replace
string管理char*所分配的内存,不用担心复制越界和取值越界等等,由类内部进行负责
2.1 string容器——构造函数
构造函数原型:
-
string(); //创建一个空的字符串 例如:string str; string(const char* s) //使用字符串s初始化
-
string(const string& str); //使用一个string对象初始化另一个string对象
-
string(int n,char c); //使用n个字符c初始化
具体实现代码:
#include<iostream>
using namespace std;
#include<string>
#include<vector>
#include<algorithm>
int main()
{
string s1;//默认构造
const char* str = "hello world";
string s2(str);//使用字符串str初始化
cout << s2 << endl;
string s3(s2);//拷贝构造
cout << s3 << endl;
string s4(10, 'a'); //使用n个字符c初始化
cout << s4 << endl;
return 0;
}
![运行结果](https://i-blog.csdnimg.cn/blog_migrate/00b124039a41daf2cbacf85305d43eee.png)
2.2 string赋值操作
功能描述:
- 给string字符串进行赋值
赋值的函数原型:
注释与函数很清楚,代码没必要
2.3 string字符串拼接
功能描述:
- 实现在字符串末尾拼接字符串
函数原型:
2.4 string查找和替换
功能描述:
- 查找:查找指定字符串是否存在
- 替换:在指定的位置替换字符串
函数原型:
2.5 string字符串比较
功能描述:
- 字符串之间的比较
比较方式:
- 字符串比较是按字符的ASCLL码进行比较
=返回 0
>返回 1
<返回 -1
函数原型:
2.6 string字符存取
string中单个字符存取方式有两种
2.7 string插入和删除
功能描述:
- 对string字符串进行插入和删除字符操作
函数原型:
2.8 string子串
功能描述:
- 从字符串中获取想要的子串
函数原型: