C++ 小白之STL初识

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;
}

猜你喜欢

转载自blog.csdn.net/qq_45252077/article/details/107915940