(C++基础_STL) —— 初识STL

27 篇文章 0 订阅
9 篇文章 1 订阅

在这里插入图片描述

(C++基础_STL) —— 初识STL

     在日常的C++开发过程中,我们会经常使用到STL最为赋能加速开发的一个基本库,那么在有一定的C++的语言的基础上,学习如何使用STL是一件非常有益与后续有益于自己面对更加复杂的需求和日常开发赋能的,因此,本人虽然工作了有一段时日了,准备开始写一系列专栏记录自己重温STL的一些用法,并加深自己对于STL的理解和运用的过程,本系列文章主要用于自己复习和参考使用,如果您看到感兴趣了也可以跟我一并一起进一步学习和探讨。

0 个人介绍

作者: 赵萱婷
简介: 一个在工业软件领域摸爬滚打的新人,毕业于华科软院的一个普通人,希望未来能够在工业设计软件领域深耕越走越远的软件工程师。
个人格言:用心去感受你自己需要坚持的生活,未来慢慢会给你答案的。
知乎:https://www.zhihu.com/people/Tom_Zhao

1 STL基本认识

1.1 STL的诞生与发展

  1. 在工业界中长久以来,软件工程设计一直希望建立一系列重复利用的东西,这个在模块化开发思想中也有类似的体现;
  2. C++的面向对象和泛型编程思想,目的就是提升模块的复用性并降低模块的耦合性;
  3. 在我所知的绝大多数情况下,数据结构和算法都未能有一套标准,因此程序员被迫从事大量重复工作;
  4. 所以,Cpp标准机构为了建立数据结构和算法的一套标准,诞生了STL。

1.2 STL的基础概念

  1. STL(Standard Template Library,标准模板库),是由C++标准化组织提供的一套通用的标准模块库;
  2. STL 从广义上分为: 容器(container)、 算法(algorithm) 和迭代器(iterator);
  3. 容器存储的数据和算法的计算方法之间需要通过迭代器进行无缝连接,并能够产生修改;
  4. STL 几乎所有的代码都采用了模板类或者模板函数,因此大部分实现主要都集中在头文件中。

1.3 STL的六大组件

     STL大体分为六大组件,分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器:

  1. 容器:对应于较为通用的数据结构,例如vectorlistdequesetmap等,用来存放数据。
  2. 算法:提供较为常用的算法,比如sortfindcopyfor_each等。
  3. 迭代器:主要是用于容器与算法之间的胶合剂的角色。
  4. 仿函数:工作的行为类似函数,是算法的某种策略的延伸。
  5. 适配器:一种用来修饰容器或者仿函数或迭代器接口的东西。
  6. 空间配置器:负责空间的配置与管理。

1.4 STL中容器、算法、迭代器的概括

     容器存储数据之地
     STL 容器就是将运用最广泛的一些数据结构实现出来,常用的数据结构:数组, 链表,树, 栈, 队列, 集合, 映射表 等。这些容器可以分为序列式容器和关联式容器两种:

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

     算法解决问题之法
     使用有限的步骤,用以解决逻辑或数学上的问题,这样的学科我们叫做算法(Algorithms), 算法可以分为, 这里可以看这样一篇参考文章:STL源码学习系列六: 算法(Algorithm):

  1. 质变算法:会改变操作对象的值。所有的STL算法都作用在[first,last)所标示的区间上,在运算过程中改变区间元素值。例如:copy,swap,replace,fill,remove,permulation,partition,sort等;
  2. 非质变算法:不改变操作对象之值。例如:find,search,count,equal,max,min等。

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

     迭代器能提供一种方法,使之依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式。每个容器都有自己专属的迭代器,迭代器使用非常类似于指针,初学阶段我们可以先理解迭代器为指针,利用指针去访问容器的每一个元素,就跟迭代器一个个取出对应的容器元素内容类似。迭代器种类可以分为:

种类功能支持的运算种类
输入迭代器对数据的只读访问只读,支持++、==、!=
输出迭代器对数据的只写访问只写,支持++
前向迭代器读写操作,并能向前推进迭代器读写,支持++、==、!=
双向迭代器读写操作,并能向前和向后操作读写,支持++、–,
随机访问迭代器读写操作,可以以跳跃的方式访问任意数据,功能最强的迭代器读写操作,可以以跳跃的方式访问任意数据,功能最强的迭代器

     我们日常工作中,最常用的容器中迭代器种类为双向迭代器,和随机访问迭代器;

1.5 Vector容器基本使用

     在了解了STL中容器算法迭代器概念之后,我们利用代码感受STL的魅力, STL中最常用的容器为Vector,可以理解为数组,下面我们将学习如何向这个容器中插入数据、并遍历这个容器:

Vector使用C++默认预定义类型

///
// Copyright (c)2020, Tom Zhao personal. ("TZOpenTools")
// This software is a personal tools project by Tom Zhao.
// Description:
///

#include <vector>
#include <algorithm>

using namespace std;

void TzTestVectorPrint(int val)
{
	cout << val << endl;
}

void BasicTestVectorCaseOne()
{
	// 创建vector容器对象,并且通过模板参数指定容器中存放的数据的类型
	vector<int> v;
	// 向容器中放数据
	v.push_back(10);
	v.push_back(20);
	v.push_back(30);
	v.push_back(40);

	// 每一个容器都有自己的迭代器,迭代器是用来遍历容器中的元素
	// v.begin()返回迭代器,这个迭代器指向容器中第一个数据
	// v.end()返回迭代器,这个迭代器指向容器元素的最后一个元素的下一个位置
	// vector<int>::iterator 拿到vector<int>这种容器的迭代器类型

	vector<int>::iterator vB= v.begin();
	vector<int>::iterator vE = v.end();

	// 第一种遍历方式:while循环的迭代器
	while (vB!= vE) {
		cout << *vB<< '\t';
		vB++;
	}
	
	// 第二种遍历方式:for 循环遍历迭代器
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << *it << '\t';
	}
	cout << endl;

	// 第三种遍历方式:利用for_each
	// 使用STL提供标准遍历算法  头文件 algorithm
	for_each(v.begin(), v.end(), TzTestVectorPrint);

	// 第四种遍历方式: 利用auto item
	for(auto item : v) 
	{
		cout << item << '\t';
	}
	cout << endl;
}

int main(int argc, char * argv[])
{
	BasicTestVectorCaseOne();
	system("pause");
	return 0;
}

Vector使用自定义类型或者类

     Vector中是可以添加我们自己定义的类作为数据对象的。


///
// Copyright (c)2020, Tom Zhao personal. ("TZOpenTools")
// This software is a personal tools project by Tom Zhao.
// Description:
///

#include <vector>
#include <string>

using namespace std;

// 自定义数据类型,定义一个Person类。
class TzPerson 
{
public:
	inline TzPerson (string name, int age)
    {
		m_name= name;
		m_age= age;
	}
	
	inline string name() const 
	{
		return m_name;
	}
	
	inline void setName(const string& name) 
	{
		if (m_name != name) 
		{
			m_name = name;
		}
	}

	inline int age() const 
	{
		return m_age;
	}
	
	inline void setAge(int age) 
	{
		if(m_age != age) 
		{
			m_age = age;
		}
	}

private:
	string m_name;
	int m_age;
};

// 存放对象
void vectorTestPerson()
{
	vector<Person> v;

	// 创建数据
	Person p1("aaa", 10);
	Person p2("bbb", 20);
	Person p3("ccc", 30);
	Person p4("ddd", 40);
	Person 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<Person>::iterator it = v.begin(); it != v.end(); it++) {
		cout << "Name:" << (*it).name() << " Age:" << (*it).age() << endl;
	}
}


// 放对象指针
void vectorTestPersonPointer()
{
	vector<Person*> v;

	// 创建数据
	Person p1("aaa", 10);
	Person p2("bbb", 20);
	Person p3("ccc", 30);
	Person p4("ddd", 40);
	Person 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<Person*>::iterator it = v.begin(); it != v.end(); it++) {
		Person * p = (*it);
		cout << "Name:" << p->name() << " Age:" << (*it)->age() << endl;
	}
}

int main(int argc, char * argv[])
{
	vectorTestPerson();
	vectorTestPersonPointer();

	system("pause");
	return 0;
}

Vector容器嵌套容器

     在vector中,是允许继续嵌套其他的容器的,目前写一个vector嵌套vector:

///
// Copyright (c)2020, Tom Zhao personal. ("TZOpenTools")
// This software is a personal tools project by Tom Zhao.
// Description:
///

#include <vector>

using namespace std;

// 容器嵌套容器
void vectorTestInVector()
{
	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);
	}

	// 将容器元素插入到vector v中
	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++) {
		for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); vit++) {
			cout << *vit << '\t';
		}
		cout << endl;
	}
}

int main(int argc, char * argv[])
{
	vectorTestInVector();

	system("pause");
	return 0;
}

个人格言

用心去感受你自己需要坚持的生活,未来慢慢会给你答案的。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值