C++学习笔记之三(标准库、标准模板库、vector类)

C++

  • 1、C++标准库
  • 2、C++标准模板库
    • 2.1、vector
      • 2.1.1、vector与array
      • 2.1.2、vector与函数对象
      • 2.1.3、vector与迭代器

1、C++标准库

C + + C++ C++标准库指的是标准程序库( S t a n d a r d Standard Standard L i b a r a y Libaray Libaray),它定义了十个大类,其中包括我们比较熟悉的 i o s t r e a m , s t r i n g iostream, string iostream,string都是这十个大类的其中一个类中的一个小类。而 c + + c++ c++的标准模板库也只是占了其中三个大类而已。
在这里插入图片描述
上面这十个类还只是一个些大类,这十个大类下面还有51个小类。例如容器类下有这些小类:
在这里插入图片描述
更多内容可以参考这篇文章,链接: C++标准库。
使用的时候,由于十个大类是一个抽象集合,本身是没办法调用的。我们只能调用这些大类下的小类,且必须通过添加头文件的形式。同时, C + + C++ C++标准强制头文件不要加 . h .h .h。下面是一些例子:

#include<iostream>				//调用输入输出类中的标准输入输出类
#include<string>				//调用字符串类
#include<vector>				//调用容器类中的vector
#include<queue>					//调用容器类中的queue
#include<algorithm>				//调用算法类

2、C++标准模板库

标准模板库( S T L : STL: STL: S t a n d a r d Standard Standard T e m p l a t e Template Template L i b r a r y Library Library)区别于标准库,它是一组用于处理各种容器对象的模板,提供了表示容器、迭代器、函数对象、和算法的模板。也就是说,标准模板库是为服务容器而设计的。
在这里插入图片描述
如上图所示,迭代器、函数对象、算法它们虽然同属于 S T L STL STL库的基本组件,但其实都是服务于容器的。

2.1、vector

V e c t o r Vector Vector中文名是矢量的意思,是容器类中最基础也是最重要的一个类。

2.1.1、vector与array

C + + C++ C++ v e c t o r vector vector a r r a y array array(数组)有很多相似之处,它们都可以被用于存放某一类型的变量。下面则来看一个入门级别的应用——用vector存放特定类型的数值。

#include<iostream>
#include<vector>

#define num 5
using namespace std;

int main()
{
	vector<int> mycontain(num);				//声明一个存放整形变量的vector
	
	for(int i=0; i<num; i++)
	{
		cout<<"please enter the "<<i+1<<" number : ";
		cin>>mycontain[i];					//跟往数组里面放数据一样,往vector里面放数据
	}
	for(int i=0; i<num; i++)
	{
		cout<<mycontain[i]<<" ";
	}
	cout<<"\n";
	
	return 0;	
}

2.1.2、vector与函数对象

v e c t o r vector vector a r r a y array array高级的地方莫过于它能和函数对象、算法以及迭代器结合起来使用,下面直接通过一些例子了解 v e c t o r vector vector和一些常规函数对象的结合。

#include<iostream>
#include<vector>

using namespace std;

void print_vector(void);		//define a function to print all of numbers in the vector

vector<int> my_vector;

int main()
{
	int i,temp;
	
	//push some number into the vector and print all of them
	while(1)
	{
		cout<<"please enter the "<<++i<<" number : ";
		cin>>temp;
		my_vector.push_back(temp);					//push_back( ),一个往vector的末端添加数字的函数,有且仅有一个输入参数。
		pd = my_vector.end();								//end(),返回值是vector末端的地址,无输入参数。
		if(*(my_vector.end()-1) == 0) break;		//if the last number you enter is zero, the program will jump out the loop.
	}
	print_vector();
	
	//erase some numbers in the vector and print out the rest
	my_vector.erase(my_vector.begin(), my_vector.begin()+2);		//.erase( , ),拆除vector中某一段数字,有两个输入参数,第一个是将要擦除的起始地址,另一个是停止地址。
																										//.begin(),返回值是vector的首部地址,无输入参数。
	print_vector();
	
	//insert a number into the vector and print all of them.
	my_vector.insert(my_vector.end(), 9);											//.insert( , ),往vector某个地方插入一个数字,两个输入参数,第一个是要插入的地址,另一个是要插入的数字
	print_vector();
	
	return 0;	
}


void print_vector(void)
{
	for(int i=0; i<my_vector.size(); i++)										//.size(),返回值vector的尺寸大小。
	{
		cout<<my_vector[i]<<" ";
	}	
	cout<<"\n";
}

看完代码,再来根据解决代码中的几个疑惑点。其一,在这句代码:“if(*(my_vector.end() - 1) == 0)”,my_vector.end(),的返回值是一个迭代器,但我这里并没有定义一个迭代器去接收它的返回值,而是直接调用该代码然后解引用。其实这样是合规的。其二,同样是这句代码,我为了拿到vector中的最后一个值,我需要在尾部的地址基础上减去一。这是由vector的性质决定的,我们来看看这个图。
在这里插入图片描述
如上图所示,my_vector.end()拿到的并不是最后一个数据的地址,而是内存中其他数据的地址。又由于vector的地址从尾部到首部呈现从高到低分布,所以需要减一,而非加一。
值得一提的是, v e c t o r vector vector的数据输入输出方式,是从尾部输入,从首部输出。并且当有新的数据输入进来的时候,my_vector.end()的迭代器会指向新输入进来的数据。而不是新输入的数据取代原来尾部的数据,这个理解尤为重要。

2.1.3、vector与迭代器

上文有提到过"my_vector.begin()"和"my_vector.end()"的返回值是一个迭代器,并且这个迭代器可以像指针那样操作。便可以大概看出,迭代器和指针颇为相似。但两者的区别是指针指向的必须是连续的内存空间,但迭代器指向的可以是间断的内存空间。这是由于一些容器的内存分配可能零散导致的,如图:
在这里插入图片描述
容器的内存空间可能间断分布,而为了准确寻找容器中的数据,迭代器就应运而生了。不过迭代器也分为五个种类,本人学识有限,就只介绍可用于 v e c t o r vector vector的那一种。直接上个例子:

#include<iostream>
#include<vector>

using namespace std;

int main()
{
	vector<int> my_vector;
	vector<int>::iterator iter;						//定义一个存放vector<int>地址的迭代器
	int temp,i=0;
	
	while(1)
	{
		cout<<"please enter the "<<++i<<" number : ";
		cin>>temp;
		my_vector.push_back(temp);			//由于内存分布不完整,当你没添加数据进去之前,它压根不知道下一个数据在那个位置,所以不能用my_vector[i]的方式赋值。
		iter = my_vector.end();					//把尾部的地址传给迭代器iter
		if(*(iter-1) == 0) break;						//解引用迭代器以获得对象的值
	}
	for(i=0; i < my_vector.size(); i++)
	{
		iter = my_vector.begin();
		cout<<*(iter+i)<<" ";							//同上
	}
	cout<<"\n";
	
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nc65单据穿透

nc65单据穿透 jych项目 1.支出合同台账合同号字段可以穿透到对应的单据上 一个合同号穿透到一个物质设备采购合同上 1.支出合同台账单据模板合同号字段卡片下和列表下高级属性勾选是否超链接 2.支出合同台账中增加监听类 HeadItemLinkListener.java package nc.ui.jych.…

算法通过村第十六关-滑动窗口|黄金笔记|结合堆的应用

文章目录 前言堆与滑动窗口结合的问题总结 前言 提示&#xff1a;不论记忆多么痛苦&#xff0c;它属于过去&#xff0c;已经逝去了&#xff0c;我们为什么还执着于它并让它代表我们&#xff1f;我们就这样&#xff0c;所以&#xff0c;我们受苦。 --丹津葩默 这个还是一个比较重…

LSTM 与 GRU

RNN无法处理长距离依赖问题&#xff0c;通俗点就是不能处理一些较长的序列数据&#xff0c;那么今天就来介绍一下两个能处理长距离依赖问题地RNN变种结构&#xff0c;LSTM和GRU。 1. LSTM&#xff08;Long short-term memory&#xff09; 1.1 LSTM结构 上左图是普通RNN结构图…

目标检测技术概述

什么是目标检测&#xff1f; 在计算机视觉众多的技术领域中&#xff0c;目标检测&#xff08;Object Detection&#xff09;也是一项非常基础的任务&#xff0c;图像分割、物体追踪、关键点检测等通常都要依赖于目标检测。在目标检测时&#xff0c;由于每张图像中物体的数量、…

JAVA入门总结回顾

1.常用的DOS命令&#xff1a;DOS窗口常用命令-CSDN博客 2.检查jdk是否安装成功&#xff1a;在cmd中输入java -version或者java或者javac。出现相应的对应显示内容。 3.JDK&#xff0c;JRE之间的关系&#xff1a;JDK是JAVA的开发工具包&#xff0c;JRE是JAVA的的运行环境。JRE…

硬件安全与机器学习的结合

文章目录 1. A HT Detection and Diagnosis Method for Gate-level Netlists based on Machine Learning摘要Introduction 2. 基于多维结构特征的硬件木马检测技术摘要Instruction 3. A Hardware Trojan Detection and Diagnosis Method for Gate-Level Netlists Based on Diff…

非遗主题网站的设计与实现基于PHP实现

包括源码参考论文 下载地址: https://juzhendongli.store/commodity/details/18

Slax Linux 获得增强的会话管理和启动参数选项

Slax Linux 的创建者和维护者托马斯-马特吉切克&#xff08;Tomas Matejicek&#xff09;在自己生日这天&#xff08;生日快乐&#xff01;&#xff09;发布了其小巧便携的 GNU/Linux 发行版的新版本&#xff0c;带来了各种增强功能和错误修复。 新发布的 Slax Linux 版本&…

On Moving Object Segmentation from Monocular Video with Transformers 论文阅读

论文信息 标题&#xff1a;On Moving Object Segmentation from Monocular Video with Transformers 作者&#xff1a; 来源&#xff1a;ICCV 时间&#xff1a;2023 代码地址&#xff1a;暂无 Abstract 通过单个移动摄像机进行移动对象检测和分割是一项具有挑战性的任务&am…

Fabric.js 复制粘贴元素

本文简介 点赞 关注 收藏 学会了 当你要复制一个 fabric 的元素时&#xff0c;你考虑到的是什么&#xff1f;是深拷贝当前选中对象再添加到画布中&#xff1f; 其实&#xff0c;fabric.js 提供了一个克隆方法&#xff0c;在 fabric.js 官网的案例里也有这个demo&#xff1a…

【博士每天一篇文献-算法】Gradient Episodic Memory for Continual Learning

阅读时间&#xff1a;2023-10-26 1 介绍 年份&#xff1a;2017 作者&#xff1a;David Lopez-Paz, Marc’Aurelio Ranzato 期刊&#xff1a;Part of Advances in Neural Information Processing Systems 30 (NIPS 2017) 引用量&#xff1a;2044 针对持续学习中灾难性遗忘问题…

[推荐]Linux安装与配置虚拟机之虚拟机服务器坏境配置

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》《Vue.js使用》 ⛺️ 越努力 &#xff0c;越幸运。 一.操作系统 1. 简介 操作系统&#xff08;perating System&#xff0c;简称OS&#xff09;是一种系统软件…

二维码智慧门牌管理系统升级解决方案:一级属性 二级属性

文章目录 前言一、什么是智慧门牌管理系统&#xff1f;二、一级属性 vs. 二级属性三、升级中的实践意义 前言 在本文中&#xff0c;我们将深入探讨二维码智慧门牌管理系统的升级解决方案&#xff0c;特别聚焦于一级属性和二级属性的关键概念。我们将详细解释这些概念&#xff…

计算机网络——理论知识总结(上)

开新番&#xff0c;因为博主备考的学校计网只考察1/6的分值&#xff0c;而且定位偏向于送分题&#xff0c;因此在备考时并没有很高强度的复习。本帖基于王道考研的教辅总结归纳&#xff0c;虽然是408的教材&#xff0c;但忽略其中有难度的部分&#xff0c;如计算题、画图题等&a…

TCP三次握手具体过程

四次挥手 1&#xff09;客户端进程发出连接释放报文&#xff0c;并且停止发送数据。释放数据报文首部&#xff0c;FIN1&#xff0c;其序列号为sequ&#xff08;等于前已经传送过来的数据的最后一个字节的序号加1)&#xff0c;此时&#xff0c;客户端进入FIN_WAIT_1&#xff08…

Mac怎么清理磁盘空间?释放Mac磁盘空间有效方法

相信很多使用macOS系统的小伙伴都收到过提示“磁盘空间已满”消息&#xff0c;尤其是采用SSD固态硬盘的MacBook系列&#xff0c;120G的硬盘空间本就捉襟见肘&#xff0c;使用一段时间后&#xff0c;即使自己没有存放很多大文件&#xff0c; Mac的磁盘很快就满了。那么&#xff…

MR混合现实情景实训教学系统在旅游管理专业中的应用

在旅游管理专业中&#xff0c;MR混合现实情景实训教学系统的主要应用包括但不限于以下几个方面&#xff1a; 1. 实地考察的替代&#xff1a;对于一些无法实地考察的景点或设施&#xff0c;学生可以通过MR系统进行虚拟参观&#xff0c;从而了解其实际情况。这不仅可以减少时间和…

计算机网络之数据链路层(全)

[复习提示] 王道&#xff1a;本章是历年考试中考查的重点。要求在了解数据链路层基本概念和功能的基础上&#xff0c;重点掌握滑动窗口机制、三种可靠传输协议、各种MAC协议、HDLC协议和PPP协议&#xff0c;特别是CSMA/CD协议和以太网帧格式&#xff0c;以及局域网的争用期和最…

c++学习MFC还是QT?

c学习MFC还是QT&#xff1f; 建议学习Qt, Qt开发不仅跨平台&#xff0c;而且社区活跃度和网上的资料也比较多一点&#xff0c;特别是跨平台这一点很重要&#xff0c;最近很多小伙伴找我&#xff0c;说想要一些QT资料&#xff0c;然后我根据自己从业十年经验&#xff0c;熬夜搞了…

Xcode iOS app启用文件共享

在info.plist中添加如下两个配置 Supports opening documents in place Application supports iTunes file sharing 结果都为YES&#xff0c;如下图所示&#xff1a; 然后&#xff0c;iOS设备查看&#xff0c;文件->我的iPhone列表中有一个和你工程名相同的文件夹出现&…