STL标准模板库简介h

STL诞生

  • 可重复利用
  • c++面向对象和泛型编程思想,目的就是重复性的提升
  • 大多数情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复工作
  • 为了建立数据结构和算法的一套标准,诞生了STL

STL基本概念

  • STL标准模板库(standard Template Library)
  • DTL从广义上分为 容器(container)算法(algorithm)迭代器(iterator)
  • 容器和算法之间通过迭代器进行无缝链接
  • STL几乎所有的代码都采用了模板或者模板函数

STL六大组件

  • STL大体分为六大组件,分别为:容器,算法,迭代器,仿函数,适配器,空间配置器
  1. 容器:各种数据结构,如vector,list,deque,set,map等数据结构
  2. 算法:各种常用算法,如sort,find,copy,each等
  3. 迭代器:扮演了容器和算法之间的胶合剂
  4. 仿函数:行为类似函数,可作为算法的某种策咯
  5. 适配器:一种用来修饰容器或者仿函数或迭代器接口的东西
  6. 空间适配器:负责空间的配置与管理

STL中容器,算法,迭代器

容器:放东西用的

STL容器就是将运用最广泛的一些数据结构实现出来

常用的数据结构有:数组,链表,树,栈,队列,集合,映射表等

这些容器分为序列式容器和关联式容器两种:

  • 序列式容器:强调值的排列,序列式容器中的每个元素均有固定的位置
  • 关联式容器:二叉树结构,各元素之间没有严格的物理上的顺序关系

算法:问题的解法(algorithms)

算法分为质变算法和非质变算法

  • 质变算法:是指运算过程中会更改区间内元素的内容,例如拷贝,替换,删除等
  • 非质变算法:是指运算过程中,不会更改区间内的全部内容,例如查找,计数,遍历,寻找极值等

 

迭代器:容器算法之间的粘合剂

提供一种方法,使之能够依序寻访某个容器中所含的元素,而又无需暴漏该容器的内部表示方式

每个容器都有自己的 专属迭代器

迭代器的使用非常类似于指针

迭代器种类:

STL标准模板库简介h_第1张图片

常用的容器中迭代器种类为双向迭代器,和随机访问迭代器

容器算法迭代器的初步认识

vector存放内置数据类型

  • 容器:vector
  • 算法:for_each
  • 迭代器:vector::iterator

STL标准模板库简介h_第2张图片

#include
#include
#include
#include
#include
using namespace std;
void myprint(int val)
{
	cout< v;
	//向容器中插入数据
	v.push_back (10);
	v.push_back (20);
	v.push_back (30);
	v.push_back (40);
	v.push_back (50);
	//通过迭代器访问容器中的数据
	vector::iterator itBegin=v.begin ();//v.begin()起始迭代器,指向容器中第一个元素
	vector::iterator itend=v.end ();//结束迭代器,指向容器中最后一个元素的下一个位置

	//第一种遍历方式
	while(itBegin !=itend )
	{
		cout<<*itBegin <::iterator it=v.begin ();it!=v.end ();it++ )
	{
		cout<<*it<

STL标准模板库简介h_第3张图片

for_each()底层实现

vector中存放自定义数据类型

看代码:

#include
#include
#include
#include
#include
using namespace std;
class animal
{
public:
	animal(string name,int age)
	{
		
		this->_name =name;
		this->_age =age;
	}
	string _name;
    int  _age;
};
void test01()
{
	//创建一个自定义类型的容器
	vectorv;
	//向容器中添加数据
	animal p1("aaa",10);
	animal p2("bbb",20);
	animal p3("ccc",30);
	animal p4("ddd",40);
	animal p5("eee",50);

	v.push_back (p1);
	v.push_back (p2);
	v.push_back (p3);
	v.push_back (p4);
	v.push_back (p5);
	
	//遍历容器中的数据
	//注意*it完成解引用后市寄存器的类型,也就是animal类型
	for(vector::iterator it=v.begin ();it!=v.end();it++)
	{
		cout<<"姓名: "<<(*it)._name <<"年龄"<<(*it)._age <_name <<"年龄"<_age <v;
	//向容器中添加数据
	animal p1("aaa",10);
	animal p2("bbb",20);
	animal p3("ccc",30);
	animal p4("ddd",40);
	animal p5("eee",50);

	v.push_back (&p1);
	v.push_back (&p2);
	v.push_back (&p3);
	v.push_back (&p4);
	v.push_back (&p5);

	//遍历容器
	for(vector::iterator pit=v.begin ();pit!=v.end();pit++)
	{
		//(*pit)是animal类型的指针
		cout<<"姓名:"<<(*(*pit))._name <<"年龄:"<<(*(*pit))._age <_name <<"年龄:"<<(*pit)->_age <

vector容器嵌套(类似于二维数组)

#include
#include
using namespace std;
void test01()
{
	vector> v;
	//创建 小容器
	vector  v1;
	vector  v2;
	vector  v3;
	vector  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);
	//通过大容器来遍历所有数据,(*it)是容器---vector
	for(vector  > ::iterator it=v.begin ();it!=v.end();it++)
	{
		for(vector ::iterator sit=(*it).begin ();sit!=(*it).end();sit++)
		{
			cout<< *sit <<" ";
		}
		cout<

string容器

本质:

  • string是c++风格的字符串,而string 本质上是一个类

string和char *的区别:

  • cha r* 是一个指针
  • string是一个类,类的内部封装了char*,管理这个字符串,是一个char *型的容器

特点:

  • string 内部封装了很多成员方法
  • 例如:查找find(),拷贝copy(),删除delete,替换replace ,插入insert
  • string 管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责

string 构造函数

构造函数原型

  • string()          //创建一个空的字符串,例如string str;
  • string (const char *s)    //使用字符串s 初始化
  • string(const string &str)//使用一个string对象初始化另外一个string 对象
  • string(int n,char c)//使用n个字符c初始化
#include
#include
#include
using namespace std;
void test01()
{
	string s1;//默认构造
	const char*str="hello world";
	string s2(str);
	cout<<"s2:"<

strint 的赋值操作

STL标准模板库简介h_第4张图片

 

#include
#include
#include
using namespace std;
void test01()
{
	string str1;
	str1="hello world";
	cout<<"str1="<STL标准模板库简介h_第5张图片

#include
#include
#include
using namespace std;
void test01()
{
	string str1="我";
	str1+="爱看剧";
	cout<<"str1="<STL标准模板库简介h_第6张图片

#include
#include
#include
using namespace std;
//查找
void test01()
{
	string str1="abcdefghijk";

	int pos=str1.find("de");//默认为0位置
	if(pos==-1)
	{
		cout<<"未找到字符串"<

#include
#include
#include
using namespace std;
//查找
void test01()
{
	string str1="zello";
	string str2="hello";
	if(str1.compare (str2)==0)
	{
		cout<<"str1==str2"<0)
	{
		cout<<"str1>str2"<

主要是比较相等

string中单个字符存取

#include
#include
#include
using namespace std;
//查找
void test01()
{
	string str="hello";
	cout<<"str="<

注:插入删除的起始下标都是从0开始的

 

string字串

 

#include
#include
#include
using namespace std;
//查找
void test01()
{
	string str="helloworld";
	string sub=str.substr(1,2);//没有参数的话,默认截取全部
	cout<<"sub="<

 

你可能感兴趣的:(C++)