STL的诞生
C++的面向对象和泛型编程思想,目的就是复用性的提升。
STL是为了建立数据结构和算法的一套标准而诞生的。
STL基本概念
Standard Template Library.标准模板库。
广义上分为:容器、算法和迭代器。
容器和算法之间通过迭代器进行连接。
STL六大组件
stl大体分为:容器、算法、迭代器、仿函数、适配器、空间配置器
容器:数据结构,如:vector、list、set等,用来存放数据。
算法:sort、find、copy等。
迭代器:容器和算法沟通的桥梁。
仿函数:协助算法完成不同的变化。
适配器:修饰容器或仿函数或迭代器接口的东西。
空间配置器:负责空间的配置与管理。
********************************************************************************//可爱的分隔符
容器分为序列式容器和关联式容器:
序列式容器:强调值的排序,每个元素都有固定的位置。
关联式容器:二叉树结构,各元素之间没有严格上的物理顺序关系。
算法分为质变算法和非质变算法:
质变算法:运算过程中为改变区间内的元素内容。如拷贝、删除等。
非质变算法:不会改变。如查找、遍历等。
迭代器:将容器和算法联系起来。
提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式。
每个容器都有自己的迭代器。类须于指针的操作.
输入迭代器:对数据的只读访问。
输出迭代器:对数据的只写访问。
前向迭代器:读写操作,并能向前推进迭代器。
双向迭代器:读写操作,并能向前和向后操作。
随机访问迭代器:读写操作,可以以跳跃的方式访问任意数据。
//常用的迭代器只有最后两个哦.
vector容器存放内置数据类型
创建数组和插入元素
vector<int> v;//创建一个vector容器
v.push_back(10);//插入元素
v.push_back(20);
v.push_back(2333);
v.push_back(66666);
利用while循环遍历数组
vector<int>::iterator itBegin = v.begin();
vector<int>::iterator itEnd = v.end();
while(itBegin != itEnd){
cout << *itBegin << endl;
itBegin++;
}
利用for循环遍历数组
for(vector<int>::iterator it=v.begin(); it != v.end(); it++){
cout << *it << endl;
}
利用STL提供的标准遍历算法(这里记得要加上algorithm头文件哦)
for_each(v.begin(),v.end(),MyPrint);
//MyPrint为输出函数
//这个算法的本质也是for循环啦,所以掌握第二个就好啦
vector容器存放自定义数据类型
这里要先写一个构造函数
class OnePiece{
public:
OnePiece(string name, string pro){
this->m_name=name;
this->m_pro=pro;
}
string m_name;
string m_pro;
};
创建vector容器,并插入数据
vector<OnePiece>v;
OnePiece o1("lufei","xiangjiao");
OnePiece o2("hongfa","mianzi");
OnePiece o3("aisi","shaoshao");
v.push_back(o1);
v.push_back(o2);
v.push_back(o3);
遍历容器
for(vector<OnePiece>::iterator it=v.begin(); it!=v.end(); it++){
cout<<"角色:"<<(*it).m_name << "果实:" << (*it).m_pro << endl;
}
存放自定义数据类型的指针
class OnePiece{
public:
OnePiece(string name, string pro){
this->m_name=name;
this->m_pro=pro;
}
string m_name;
string m_pro;
};
void bobo(){
vector<OnePiece*>v;
OnePiece o1("lufei","xiangjiao");
OnePiece o2("hongfa","mianzi");
OnePiece o3("aisi","shaoshao");
v.push_back(&o1);
v.push_back(&o2);
v.push_back(&o3);
for(vector<OnePiece*>::iterator it=v.begin(); it!=v.end(); it++){
cout<<"角色:"<<(*it)->m_name << "果实:" << (*it)->m_pro << endl;
}
}
vector容器嵌套容器
vector< vector<int>>v;
vector<int>v1;//这里先创建小容器
vector<int>v2;
vector<int>v3;
//向小容器里添加数据
for(int i = 0; i < 3; 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;
}