1.1 STL基本概念

1 STL概述

STL是StandardTemplateLibrary的简称,标准模板库,惠普实验室开发的一系列软件的统称。它是由AlexanderStepanov、MengLee和DavidRMusser在惠普实验室工作时所开发出来的。这可能是一个历史上最令人兴奋的工具的最无聊的术语。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL现在是C++的一部分,因此不用额外安装什么。
——搜狗百科

我认为其本质是为了提升代码复用性,使得之后的程序员可以站在前人的肩膀上,不必重复大量造轮子的工作,以减少企业人力资源的浪费等(更好压榨员工(打趣) )。

1.1 STL基本概念

STL广义上分为:容器(container) 算法(algorithm) 迭代器(iterator)

1.2 STL 六大组件

容器(vector,list…)
算法(sort,find…)
迭代器(扮演容器算法之间的胶合剂,所有STL容器都有自己的专属迭代器)
仿函数(行为类似函数,可作为算法的某种策略)
适配器(一种用来修饰容器或者仿函数或迭代器接口的东西)
空间配置器(空间的配置与管理)

六大件的交互关系,容器通过空间配置器取得数据存储空间,算法通过迭代器存储容器中的内容,仿函数可以协助算法完成不同策略的变化,适配器可以修饰仿函数。

1.3 STL优点

  • 高可重复性
  • 高性能
  • 高移植性

但是正因为程序员不用思考STL具体的实现过程,对于初学者应该尝试自己写。

2.1 容器

序列式容器(排序,如Vector,List,Deque容器)
关联式容器(元素在容器中并没有保存元素置入容器时的逻辑顺序)

2.2 算法

质变算法(运算过程改变区间内元素内容)
非质变算法(不改变,如遍历,查找)

2.3 迭代器

举例:
iterator模式定义:提供一种方法,使之能够依序访问某个容器所含的各个元素,而又无需暴露该容器内部展示方式。
种类:
Input iterator(输入迭代器)
读,不能写;只支持自增运算

Output iterator(输出迭代器)
写,不能读;只支持自增运算

Forward iterator(前向迭代器)
读和写;只支持自增运算

Bidirectional iterator(双向迭代器)
读和写;支持自增和自减运算

Random access iterator(随机访问迭代器)
读和写;支持完整的迭代器算术运算

2.4 示例

#include<iostream>
using namespace std;
#include<algorithm>
#include<string>

//容器 vector
#include<vector>

void myPrint(int v)
{
	cout << v << endl;
}

void text02()
{
	vector<int> v;//声明
	//插入
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);
	v.push_back(50);
    //遍历
	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;
	}*/

	//第三种(头文件#include<algorithm>,函数myPrint)
	for_each(v.begin(), v.end(), myPrint);
}

//迭代器 遍历功能 用指针理解,普通指针也算一种迭代器
void text01()
{
	int arr[5] = { 1,2,3,4,6 };
	int* p = arr;
	for (int i = 0; i < 5; i++)
	{
		cout << *(p++) << endl;
	}
}

//操作自定义数据类型
class Person
{
public:
	Person(string name, int age)
	{
		this->m_Name = name;
		this->m_Age = age;
	}
	string m_Name;
	int m_Age;
};

void text03()
{
	vector<Person> v;
	Person p1("zimei",10);
	Person p2("xiedalao", 10);
	v.push_back(p1);
	v.push_back(p2);

	//for (auto k : v)
	//{
	//	cout << k.m_Age << k.m_Name << endl;
	//}
	for (vector<Person>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << "name:" << (*it).m_Name << "\tage:" << it->m_Age << endl;
	}
}

int main()
{
	text01();
	text02();
	text03();
	return 0;
}

基于黑马STL课程整理

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只子美

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值