C++ 小白之STL初识
话不多说,日常整理时间到,今天要整理的是STL(standard template library、标准模板库),我大致上了解了些,觉得STL真是太好用了o( ̄▽ ̄)ブ。今天算是初识STL了,就来总结一番吧。
1、STL初始 — STL的基本概念
1.1 STL的诞生
(1)长久以来,软件界一直希望建立一种可重复利用的东西。
(2)C++的面向对象和泛型编程思想,目的就是复用性提升。
(3)大多数情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复工作。
(4)为了建立数据结构和算法的一套标准,诞生了STL。
1.2 STL基本概念
(1)STL(standard template library、标准模板库)
(2)STL从广义上分为:容器(container)、算法(algorithm)、迭代器(iterator)
(3)容器和算法之间通过迭代器进行无缝连接
(4)STL几乎所有的代码都采用了模板类或者模板函数
1.3 STL六大组件
STL大体分为六大组件、分别是:容器,算法,迭代器,仿函数,适配器(配接器),空间适配器
1、容器:各种数据结构,如vector、list、deque、set、map等。用来存放数据。
2、算法:各种常用算法,如sort、find、copy、for_each等。
3、迭代器:扮演了容器与算法之间的胶合剂。
4、仿函数:行为类似函数可作为算法某种策略。
5、适配器:一种用来修饰容器或者仿函数或迭代器接口的东西。
6、空间适配器:负责空间的配置与管理。
1.4 STL中容器、算法、迭代器
容器:置物之所也
STL容器就是将运用最广泛的一类数据结构实现出来
常用的数据结构:数组,链表,数,栈、队列、集合、映射表等。
这些容器分为序列容器和关联容器两种:
序列式容器:强调值的排序,序列式容器中的每个元素均有固定的位置。
关联式容器:二叉树结构,各元素之间没有严格的物理上的顺序关系。
算法:问题之解法也
有限的步骤,解决逻辑或数学上的问题,这一门学科我们叫做算法(Algorithms)
算法分为:质变算法和非质变算法。
质变算法:是指运算过程中会更改区间内的元素内容,例如拷贝、替换、删除等等。
非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等。
迭代器:容器与算法之间粘合剂
提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式。
每个容器都有自己专属的迭代器
迭代器使用非常类似于指针,初始阶段可以理解迭代器为指针。
迭代器的种类:
输入迭代器
常用的容器中迭代器种类为双向迭代器,和随机访问迭代器。
1.5 vector存放内置数据类型
容器:vector
算法:for_each
迭代器:vector::iterator
STL算法头文件:#include <algorithm>
三种遍历迭代器及测试代码:
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
void myPrint(int val)
{
cout<<val<<endl;
}
void test01()
{
//创建了一个vector容器,数组
vector<int> v;
//向容器中插入数据
v.push_back(10);
v.push_back(11);
v.push_back(12);
v.push_back(13);
v.push_back(14);
//通过迭代器访问容器中的数据
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<<*it<<endl;
}
//第三种遍历方式 利用STL提高遍历算法
for_each(v.begin(),v.end(),myPrint);//需要在声明一个myPrint的函数
}
int main()
{
test01();
system("pause");
return 0;
}
1.6 vector存放自定义数据类型
演示代码如下:
#include<iostream>
using namespace std;
#include<vector>
#include<string>
//vector容器中存放自定义数据类型
class Person
{
public:
Person(string name,int age)
{
this->m_Name=name;
this->m_Age=age;
}
string m_Name;
int m_Age;
};
void test01()
{
vector<Person>v;
Person p1("wjx",11);
Person p2("p",11);
Person p3("苏",10);
Person p4("re",11);
Person p5("tyu",11);
//向容器中添加数据
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);
v.push_back(p5);
//遍历容器中的数据
for(vector<Person>::iterator it=v.begin();it!=v.end();it++)
{
cout<<"姓名:"<<(*it).m_Name<<"年龄:"<<(*it).m_Age<<endl;
cout<<"姓名:"<<it->m_Name<<"年龄:"<<it->m_Age<<endl;
}
}
void test02()
{
vector<Person*>v;
Person p1("wjx",11);
Person p2("py",11);
Person p3("苏",10);
Person p4("re",11);
Person p5("tyu",11);
//向容器中添加数据
v.push_back(&p1);
v.push_back(&p2);
v.push_back(&p3);
v.push_back(&p4);
v.push_back(&p5);
//遍历容器
for(vector<Person *>::iterator it=v.begin();it!=v.end();it++)
{
cout<<"姓名:"<<(*it)->m_Name<<"年龄:"<<(*it)->m_Age<<endl;
}
}
int main()
{
//test01();
test02();
system("pause");
return 0;
}
1.7 容器嵌套容器
类似于二维数组调用,掉用代码如下:
分为总的大容器,与大容器包含的小容器。
#include<iostream>
using namespace std;
#include<vector>
//容器嵌套容器
void test01()
{
vector<vector<int>>v;
//创建小容器
vector<int>v1;
vector<int>v2;
vector<int>v3;
vector<int>v4;
//向小容器中添加数据
for(int i=0;i<=4;i++)
{
v1.push_back(i+1);
v2.push_back(i+2);
v3.push_back(i+3);
v4.push_back(i+4);
}
//将小容器插入到大容器中
v.push_back(v1);
v.push_back(v2);
v.push_back(v3);
v.push_back(v4);
//通过大容器将所有数组遍历一遍
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;
}
}
int main()
{
test01();
system("pause");
return 0;
}