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

C++

  • 1、C++标准库
  • 2、C++标准模板库
    • 2.1、vector
      • 2.1.1、vector与array
      • 2.1.2、vector与函数对象
      • 2.1.3、vector与迭代器
      • 2.1.4、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)区别于标准库,它是一组用于处理各种容器对象的模板,提供了表示容器、迭代器、函数对象、和算法的模板。也就是说,标准模板库是为服务容器而设计的。其中比较容易被忽略的是, a r r a y array array其实也是容器中的一种。
在这里插入图片描述
如上图所示,迭代器、函数对象、算法它们虽然同属于 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);				//声明一个存放整形变量的vectorfor(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 vectorvector<int> my_vector;int main()
{int i,temp;//push some number into the vector and print all of themwhile(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 restmy_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();					//把尾部的地址传给迭代器iterif(*(iter-1) == 0) break;						//解引用迭代器以获得对象的值}for(i=0; i < my_vector.size(); i++){iter = my_vector.begin();cout<<*(iter+i)<<" ";							//同上}cout<<"\n";return 0;
}

2.1.4、vector与算法

这里的算法特指对vector内部数据进行处理的算法,如排序、变换、打乱等。直接上代码看看一些常用的算法怎么用。由于算法部分内容太庞大了,所以这几句话带过会显得十分草率。

#include<iostream>
#include<algorithm>
#include<vector>
#include<iterator>using namespace std;void vector_print(void);
vector<int>::iterator iter;
int array[9] = {1,5,2,7,9,11,3,6,2};
vector<int> my_vector(array,array+9);int main()
{	sort(my_vector.begin(), my_vector.end(), greater<int>());			//输入参数为两个或者三个,前两个参数为迭代器的始末值,最后一个参数是排序标准。vector_print();random_shuffle(my_vector.begin(), my_vector.end());			//输入参数为两个,前两个参数为迭代器的始末值。vector_print();vector<int>::iterator temp = find(my_vector.begin(), my_vector.end(), 9);		//前两个参数为迭代器的始末值,最后一个参数是要查找的值,返回值也是一个迭代器。cout<<*temp<<endl;return 0;
}void vector_print()
{iter = my_vector.begin();for(int i = 0;i<my_vector.size();i++){cout<<*(iter+i)<<" ";}cout<<"\n";	
}

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

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

相关文章

亚马逊,速卖通,美客多如何打造爆款商品,排名提升榜首

1、产品Listing的完整性 Listing是亚马逊A9算法认识你产品的基础&#xff0c;在发布一条listing的时候&#xff0c;尽可能地做到最好!在准备一条listing之前&#xff0c;一定事先要收集、整理足够多的产品关键词&#xff0c;在优化listing内容的时候填充进去。仔细观察优秀竞品…

Realrek 2.5G交换机 8+1万兆光RTL8373-VB-CG方案简介

新一代2.5G交换机方案RTL8373-VB-CG可以提供4中不同形态 a. 52.5G 电口110G光》RTL8373 b. 52.5G 电口110G电》RTL83738261 c. 82.5G 电口110G光》RTL83738224 d.82.5G 电口110G电口》RTL837382248261 1.概述 Realtek RTL8373-CG是一款低功耗、高性能、高度集成的八端口2.5G和一…

C++设计模式_19_Memento 备忘录(理解,目前多使用序列化方案来实现)

Memento 备忘录模式也属于“状态变化”模式&#xff0c;它是一个小模式&#xff0c;在今天来看有些过时&#xff0c;当今已经很少使用当前模式实现需求&#xff0c;思想却不变&#xff08;信息隐藏&#xff09;&#xff0c;目前多使用序列化方案来实现。本系列所介绍的模式&…

小程序开发——小程序项目的配置与生命周期

1.app.json配置属性 app.json配置属性 2.页面配置 app的页面配置指的是pages属性&#xff0c; pages数组的第一个页面将默认作为小程序的启动页。利用开发工具新建页面时&#xff0c;则pages属性对应的数组将自动添加该页面的路径&#xff0c;若是在硬盘中添加文件的形式则不…

C++数据结构X篇_23_快速排序(最快、不稳定的排序)

文章参考十大经典排序算法-快速排序算法详解进行整理补充。快速排序是最快的排序方法。 排序思路&#xff1a;分治法-挖坑填数&#xff1a;大问题分解为各个小问题&#xff0c;对小问题求解&#xff0c;使得大问题得以解决 文章目录 1. 什么是快速排序1.1 概念1.2 算法原理1.3 …

Linux rm命令:删除文件或目录

当 Linux 系统使用很长时间之后&#xff0c;可能会有一些已经没用的文件&#xff08;即垃圾&#xff09;&#xff0c;这些文件不但会消耗宝贵的硬盘资源&#xff0c;还是降低系统的运行效率&#xff0c;因此需要及时地清理。 rm 是强大的删除命令&#xff0c;它可以永久性地删除…

一百九十七、Java——IDEA项目中把多层文件夹拆开显示

一、目的 由于IDEA项目中&#xff0c;默认的是把文件夹连在一起显示&#xff0c;于是为了方便需要把这些连在一起的文件夹拆开&#xff0c;分层显示 如文件夹cn.kgc 二、解决措施 解决方法很简单 &#xff08;一&#xff09;找到IDEA项目上的小齿轮 &#xff08;二&#xf…

基于深度学习的单图像人群计数研究:网络设计、损失函数和监控信号

摘要 https://arxiv.org/pdf/2012.15685v2.pdf 单图像人群计数是一个具有挑战性的计算机视觉问题,在公共安全、城市规划、交通管理等领域有着广泛的应用。近年来,随着深度学习技术的发展,人群计数引起了广泛的关注并取得了巨大的成功。通过系统地回顾和总结2015年以来基于深…

基于STM32的多功能智能密码锁控制设计

**单片机设计介绍&#xff0c;1653基于STM32的多功能智能密码锁控制设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序文档 六、 文章目录 一 概要 基于STM32的多功能智能密码锁控制设计是一种用STM32微控制器开发的系统&#xff0c;用于控制和管理密码…

手机桌面待办事项APP推荐,手机上可使用哪些待办事项APP

生活中&#xff0c;无论你是一名专业人士&#xff0c;学生&#xff0c;还是家庭主妇&#xff0c;总有各种各样的任务等待着你&#xff0c;有时候需要额外的工具来提醒和管理这些待办事项。手机上的待办事项APP软件成为了这个任务的好帮手&#xff0c;为我们提供了快速、方便的方…

spring boot配置ssl(多cer格式)保姆级教程

1. 准备cer格式的证书&#xff1b; 2. 合并cer证书并转化成jks格式的证书 为啥有这一步&#xff0c;因为cer证书配置在spring boot项目中&#xff0c;项目启动不起来。如果有大佬想指导一下可以给我留言&#xff0c;在此先谢过大佬。 1&#xff09;先创建一个jks格式的证…

Kotlin(八) 数据类、单例

目录 一&#xff1a;创建数据类 二&#xff1a;单例类 一&#xff1a;创建数据类 和Java的不同&#xff0c;kotlin的数据类比较简单&#xff0c;New→Kotlin File/Class&#xff0c;在弹出的对话框中输入“Book”&#xff0c;创建类型选择“Data”。如图&#xff1a; 然后编…

Keil Map信息解析

基本功能&#xff1a; 1.在Keil里面&#xff0c;通过App.Map复制所有信息。然后解析剪辑版内容。 2.随意输入一个函数内存地址&#xff0c;即可遍历出该内存地址属于哪个.c或者函数名。或者能遍历出变量。 强化功能&#xff1a; 1.通过Keil5 命令 Save xxxxxxx\1.Hex 0x200173…

为什么我觉得Rust比C++复杂得多?

为什么我觉得Rust比C复杂得多&#xff1f; Rust自学确实有一定门槛&#xff0c;很多具体问题解决起来搜索引擎也不太帮的上忙&#xff0c;会出现卡住的情况&#xff0c;卡的时间长了就放弃了。最近很多小伙伴找我&#xff0c;说想要一些c语言资料&#xff0c;然后我根据自己从…

SpringCloudAlibaba实战-nacos集群部署

写在前面&#xff1a;在学习阶段&#xff0c;我们想快速学习SpringCloudAlibaba功能&#xff0c;但总是花费大量时间跟着视频或博客做组件配置。由于版本的更迭&#xff0c;我们学习时的组件版本很可能和作者的不一致&#xff0c;又或者是各自环境不一&#xff0c;只能一坑又一…

kubernets挑战实验一(| pvc | pod | services | rolebinding | context)

参考&#xff1a; https://kubernetes.io/zh-cn/docs/tasks/access-application-cluster/configure-access-multiple-clusters/ Deploy the given architecture diagram for implementing a Jekyll SSG. 1、创建pvc使用,以下条件限制 Storage Request: 1Gi Access modes: Re…

【WSL 2】Windows10 安装 WSL 2,并配合 Windows Terminal 和 VSCode 使用

【WSL 2】Windows10 安装 WSL 2&#xff0c;并配合 Windows Terminal 和 VSCode 使用 1 安装 Windows Terminal2 安装 WSL 23 在 Windows 文件资源管理器中打开 WSL 项目4 在 VSCode 中使用 WSL 24.1 必要准备4.2 从 VSCode 中 Connect WSL4.3 从 Linux 中打开 VSCode 1 安装 W…

✔ ★【备战实习(面经+项目+算法)】 10.29学习

✔ ★【备战实习&#xff08;面经项目算法&#xff09;】 坚持完成每天必做如何找到好工作1. 科学的学习方法&#xff08;专注&#xff01;效率&#xff01;记忆&#xff01;心流&#xff01;&#xff09;2. 每天认真完成必做项&#xff0c;踏实学习技术 认真完成每天必做&…

企业微信接入芋道SpringBoot项目

背景&#xff1a;使用芋道框架编写了一个数据看板功能需要嵌入到企业微信中&#xff0c;方便各级人员实时观看 接入企业微信的话肯定不能像平常pc端一样先登录再根据权限看页面&#xff0c;不然的话不如直接手机浏览器打开登录账号来得更为方便&#xff0c;所以迎面而来面临两…

在CentOS上用yum方式安装MySQL8过程记录

此文参考官方文档一步一步记录安装到正常运行全过程 安装环境&#xff1a;centos7 mysql版本&#xff1a;8.0.35 安装过程主要参考下面两边文章&#xff1a; 1.官方文档 https://dev.mysql.com/doc/refman/8.0/en/linux-installation-yum-repo.html 2.linux yum安装mysql8 安…