C++之STL

news2024/11/28 12:53:38

一、六大组件:

容器

各种数据结构,如vector、list、deque、set、map等,用来存放数据,从实现角度来看,STL容器是一种class template。

算法

各种常用的算法,如sort、find、copy、for_each。从实现的角度来看,STL算法是一种function tempalte。

迭代器

扮演了容器与算法之间的胶合剂,共有五种类型,从实现角度来看,迭代器是一种将operator* , operator-> , operator++,operator–等指针相关操作予以重载的class template. 所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。

仿函数

行为类似函数,可作为算法的某种策略。从实现角度来看,仿函数是一种重载了operator()的class 或者class template。

适配器

一种用来修饰容器或者仿函数或迭代器接口的东西。

空间配置器

负责空间的配置与管理。从实现角度看,配置器是一个实现了动态空间配置、空间管理、空间释放的class tempalte。

二、优点

        1.STL 是 C++的一部分,因此不用额外安装什么,它被内建在你的编译器之内。
        2.STL 的一个重要特性是将数据和操作分离。数据由容器类别加以管理,操作则由可定制的算法定义。迭代器在两者之间充当“粘合剂”,以使算法可以和容器交互运作
程序员可以不用思考 STL 具体的实现过程,只要能够熟练使用 STL 就 OK 了。这样他们就可以把精力放在程序开发的别的方面。
        3.STL 具有高可重用性,高性能,高移植性,跨平台的优点。
        高可重用性:STL 中几乎所有的代码都采用了模板类和模版函数的方式实现,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。
        高性能:如 map 可以高效地从十万条记录里面查找出指定的记录,因为 map 是采用红黑树的变体实现的。
        高移植性:如在项目 A 上用 STL 编写的模块,可以直接移植到项目 B 上。

三、普通示例代码

* STL--标准模板库 容器(类模板)和算法(函数模板)
* 容器--vector,stack,queue,list,set,map,multiset,multimap...
* 算法--copy,sort,find,find_if,count,count_if,swap...
* 迭代器--容器和算法的粘合剂--可以将他认为指针
*    用迭代器将容器中的元素访问出来然后通过算法来操作
* 类似:数组(容器) 排序(算法)指针(迭代器)
* 仿函数--函数对象,将它放在算法中,可以将算法的功能得以扩展
* 每个容器封装了自己得迭代器

int main()
{
	int num[5] = { 1,2,3,4,5 };
	vector<int> vv1;//空对象
	vector<int> vv2(5);//5个0
	vector<int> vv3(4,9);//4个9
	vector<int> vv4(num,num+5);//1 2 3 4 5
	vector<int> vv5(vv4.begin(),vv4.end());//begin指向第一个元素,end指向最后一个元素的下一个
	vector<int> vv6(vv3);
	vector<int> vv7;
	vv7 = vv2;
	int i;
	for (i = 0; i < vv4.size(); i++)
		cout << vv4[i] << " ";
	cout << endl;
	vv4[3] = 20;
	for (i = 0; i < vv4.size(); i++)
		cout << vv4[i] << " ";
	cout << endl;
	vv1.push_back(1);
	vv1.push_back(2);
	vector<int>::iterator iter;//iter是iterator类型的变量+66666669
	for (iter = vv1.begin(); iter != vv1.end(); iter++)
		cout << *iter << " ";
	cout << endl;
	cout << "front" << vv1.front() << endl;//输出第一个
	cout << "back" << vv1.back() << endl;//输出最后一个
	vv1.assign(5, 6);//重新赋值
	vv1.assign(num, num + 5);
	vv1.assign(vv4.begin(), vv4.begin() + 3);

	copy(vv4.begin(), vv4.end(), ostream_iterator<int>(cout, " "));
	cout << endl;
	//for_each(vv4.begin(), vv4.end(), Print);
	cout << endl;
	//int* p = num; p++;//指针
	cout << "用copy实现:" << endl;
	copy(vv4.begin(), vv4.end(), ostream_iterator<int>(cout, " "));
	cout << endl;
	cout << "用for_each实现:" << endl;
	for_each(vv4.begin(), vv4.end(), print);
	cout << endl;
	for_each(vv4.begin(), vv4.end(), Print<int>());
	for_each(vv4.begin(), vv4.end(), sum);
	cout << "g_sum = " << g_sum << endl;
	vv1.at(2) = 50;
	cout << "at:" << "[]" << vv1.at(2) << endl;//vv1[1]

	vv1.clear(); //清空
	cout << "vv1.size = " << vv1.size() << endl;

	vv4.emplace(vv4.begin(), 100);
	vv4.emplace_back(200);

	vv4.erase(vv4.begin() + 2, vv4.begin() + 4);
	vv4.erase(vv4.begin());

	vv4.insert(vv4.begin(), 5, 10);
	vv4.insert(vv4.begin() + 4, num, num + 5);
	vv4.push_back(300);
	vv4.push_back(500);

	vv4.swap(vv1);

	//	iter++;
	//	list<int> ::iterator iter1;
	//	iter1++;
		//int* p = num; *p++	
}

运行结果

54497d28ad4443c8a109c2b16ee7f7e3.png

 四、具体实例代码


class Student
{
public:
	Student(int num = 0, string name = "") :m_num(num), m_name(name) {}
	int GetNum()const
	{
		return m_num;
	}
	string GetName()const
	{
		return m_name;
	}
private:
	int m_num;
	string m_name;
};
bool cmp(Student& a, Student& b)
{
	return a.GetNum() < b.GetNum();
}
void main()
{
	vector<Student> vs;
	vs.push_back(Student(1001, "aaa"));
	vs.push_back(Student(1007, "fff"));
	vs.push_back(Student(1002, "bbb"));
	vs.push_back(Student(1003, "ccc"));
	vector<Student>::iterator iter;
	for (iter = vs.begin(); iter != vs.end(); iter++)
	{
		//cout << iter->GetNum() << " " << iter->GetName() << " " << endl;
		cout << (*iter).GetNum() << " " << (*iter).GetName() << endl;
	}
	sort(vs.begin(), vs.end(), cmp);
	cout << "sort:" << endl;
	for (iter = vs.begin(); iter != vs.end(); iter++)
	{
		//cout << iter->GetNum() << " " << iter->GetName() << " " << endl;
		cout << (*iter).GetNum() << " " << (*iter).GetName() << endl;
	}
}

运行结果

d4f6199d9e464f04b79d50885c143a2f.png

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/537666.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

你也可以成为营销策划大咖,只需掌握这些技巧

本人是从业营销策划行业近10年的老广告人&#xff0c;我说的话你可以选择相信。 千万不要看轻了广告策划这个职业的技术含量&#xff0c;不是说你语言文字能力比较好就一定能够适合这个行业。 想要进入这个行业的大公司&#xff0c;你如果是刚毕业的新人的话&#xff0c;首先…

Linux的使用

强制停止 ctrlc 停止程序的运行退出当前命令的输入 退出或登出 ctrld 退出账户的登录退出某些特定程序的专属页面不能用于退出vi/vim 历史命令搜索 查看历史输入过的命令 history可通过! 命令前缀&#xff0c;自动执行上一次匹配前缀的命令&#xff08;用于最近的2~3/4~5个…

SpringBoot中如何处理MySQL中存储的JSON数据?

目录 一、MySQL中如何保存JSON类型的数据 1.1 建表 1.2 保存一条带json的记录 1.3 查询 二、Springboot操作当前数据库表 2.1 方式一&#xff08;推荐&#xff09; 2.2 方式二 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式 。简洁…

Nginx安装及其常用命令(实操版)

Nginx安装及其常用命令&#xff08;实操版&#xff09; 一、安装Nginx1、准备工作2、开始进行 nginx 安装 二、Nginx常用命令三、nginx.conf配置文件1、位置2、配置文件中的内容&#xff08;包含三部分&#xff09; 四、Nginx 反向代理实例 21、实现效果2、准备工作 五、Nginx …

从萌芽到巨人: 揭秘Rod Johnson与Spring框架的故事

前言 在这个充满创意和技术追求的世界中&#xff0c;有一个名为 Spring 的框架&#xff0c;它孕育了无数创新和成功的故事。这是一个关于持续进化和超越自我的故事&#xff0c;一个激励人心的旅程&#xff0c;由一位富有远见的程序员和他的团队引领着。从最初的概念到如今的成熟…

【Vue3+TS项目】硅谷甄选day02--后台管理系统模板搭建/项目配置

1 项目初始化 一个项目要有统一的规范&#xff0c;需要使用eslintstylelintprettier来对我们的代码质量做检测和修复&#xff0c;需要使用husky来做commit拦截&#xff0c;需要使用commitlint来统一提交规范&#xff0c;需要使用preinstall来统一包管理工具。 1.1 环境准备 n…

存储系统及主存储器

存储器概述 分类 存储器的分类如下&#xff1a; 主存的分类&#xff1a; 主存分为随机存储器&#xff08;RAM&#xff09;和静态存储器&#xff08;RAM&#xff09;&#xff0c;随机存储器又分为静态RAM和动态RAM 存储器的层次结构 金字塔结构 主存-辅存及主存-缓存结构 …

CentOS安装MySQL5.7/8.0

CentOS安装MySQL 0. 官方教程1. 添加MySQL Yum存储库1.1 官网下载yum存储库1.2 本地安装存储库 2. 安装MySQL数据库2.1 安装MySQL5.72.2 安装MySQL8.0 3. 开启并设置MySQL服务自启动4. 修改数据库root用户密码5. 设置root用户远程连接数据库【可选】 0. 官方教程 官网教程链接…

用xshell把本地的文件夹传入服务器中,在两个服务器之间互传文件夹

两个服务器之间互传文件 假设有两个服务器A和B&#xff0c;现在你需要把A里面的东西传入B里面。 进入B服务器&#xff0c;如你想把A服务器中/root/one/unet放在B服务器中root/ww下&#xff0c;输入以下命令 scp -r -P YYY rootXX.XX.XXX.XX:/root/one/unet root/ww其中YY是你…

深度异常检测入门

异常检测定义 Anomaly detection。异常检测是对与标准行为或模式显著不同的罕见事件、项目或可疑观察的识别。异常也被称为异常值、噪声、偏差等。 对于异常的理解&#xff1a; 异常不一定是无用的&#xff0c;部分异常对数据挖掘领域有较大的价值不同的场景下&#xff0c;异…

CHATGPT的前世今生

ChatGPT是一款基于GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型的聊天机器人&#xff0c;它的前世今生充满着令人惊叹的故事。在这篇文章中&#xff0c;我们将深入探讨ChatGPT的诞生、发展和未来。 一、ChatGPT的起源 ChatGPT是由OpenAI团队开发的一款…

夏驰和徐策的解决数学问题思路之——数学归纳法

前言&#xff1a; 今天在复习概率论1.2.3 事件的概率及其性质中证明性质2有限可加性中运用到了数学归纳法&#xff0c;我对数学归纳法早有听闻&#xff0c;但是一直不知道怎么用这个方法&#xff0c;其实数学归纳法早在高中我们就已经接触到了在人教版教材选修2中就有这个方法…

ChatGPT 3.5 API的调用不全指南(持续更新ing...)

诸神缄默不语-个人CSDN博文目录 最近更新时间&#xff1a;2023.5.17 最早更新时间&#xff1a;2023.5.17 关于怎么才能上ChatGPT、怎么才能获取API额度等等信息&#xff0c;建议直接见我的medium账号。 因为这不是能在内网发的内容。 本文不涉及相关网络问题。 我本来想靠问…

【云原生|Kubernetes】03-Pod详解

【云原生|Kubernetes】03-Pod详解 文章目录 【云原生|Kubernetes】03-Pod详解前言Pod解析Pod简介Pod的组成Pod中的几种容器的概念Pause容器初始化容器主容器伴随容器容器的启动顺序容器与pod与node的关系 Pod种类普通Pod静态pod静态Pod创建方式配置文件方式http方式 Job PodCro…

Debian11之 K3s 部署 K8S 集群

K3S 架构方案 Server 节点指的是运行 k3s server 命令的主机&#xff0c;control plane 和数据存储组件由 K3s 管理Agent 节点指的是运行 k3s agent 命令的主机&#xff0c;不具有任何数据存储或 control plane 组件Server 和 Agent 都运行 kubelet、容器运行时和 CNI 基于 …

ESP32C3之PlatformIO IDE开发环境

一、下载​​platformio ide扩展 在vscode里面直接搜索​​platformio ide&#xff0c;点击安装即可 二、新建esp32c3工程 2.1 首先点击小蚂蚁的图标&#xff0c;然后点击pio home 2.2 点击projects->create New Project 2.3 填写工程名和工程路径:勾选钩表示默认路径&a…

Kubernetes第1天

第一章 kubernetes介绍 本章节主要介绍应用程序在服务器上部署方式演变以及kubernetes的概念、组件和工作原理。 应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个时代&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物…

Redis学习---02

一、Redis基础知识 (1)redis默认有16个数据库;默认使用的是第0个数据库&#xff1b;切换数据库&#xff1a; select index 获取数据库中的值大小&#xff1a;dbsize (2)&#xff1a;查看所有的key (3):清空当前数据库&#xff1a;flushdb (4)清空所有的数据库&#xff1a;flu…

LCD1602液晶显示模块

1.认识LCD1602 1、概述&#xff1a; LCD1602&#xff08;Liquid Crystal Display&#xff09;是一种工业字符型液晶&#xff0c;能够同时显示 1602&#xff0c;32个 字符(16列两行)。是我们接触引脚最多的模块。LCD1602我们的非标准协议&#xff08;标准协议有IIC、IIS、SPI&…

利用暴力攻击破解登陆密码

长久以来&#xff0c;入侵远程计算机系统的工具和技术并没有发生翻天覆地的变化。例如&#xff0c;在许多情况下&#xff0c;普通用户只要知道了相关密码&#xff0c;就能立刻变身为管理员。虽然这些情形听起来不够曲折&#xff0c;但在大多数情况下&#xff0c;暴力攻击是通过…