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.rhkb.cn/news/176206.html

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

相关文章

如何使用IP归属地查询API加强网络安全

引言 在当今数字化时代&#xff0c;网络安全对于个人和组织来说至关重要。恶意网络活动的威胁不断增加&#xff0c;因此采取有效的措施来加强网络安全至关重要。其中之一是利用IP归属地查询API。这个工具可以为您的网络安全策略提供宝贵的信息&#xff0c;帮助您更好地保护自己…

huggingface离线模式及默认保存路径

T5Tokenizer.from_pretrained()函数会在线下载huggingface上的模型&#xff0c;并自动保存在C盘的.cache路径下&#xff1a; C:\Users\xxxxx\.cache\huggingface\hub\models--google--t5-v1_1-base # 这里xxxxx代表自己电脑用户名huggingface离线下载 以google/t5-v1_1-base为…

win10 下编译ffmpeg3.36.tar.gz

所需工具&#xff1a; win10 ffmpeg3.36.tar.gz。 或其他版本&#xff0c;下载地址&#xff1a;Index of /releases msys2。 下载地址&#xff1a;http://www.msys2.org。 Visual Studio 2017。 1. 安装MSYS MSYS2像是windows下的一个子系统&#xff0c;…

hadoop权威指南第四版

第一部分 HaDOOP基础知识 1.1 面临的问题 存储越来越大&#xff0c;读写跟不上。 并行读多个磁盘。 问题1 磁盘损坏 – 备份数据HDFS 问题2 读取多个磁盘用于分析&#xff0c;数据容易出错 --MR 编程模型 1.2 衍生品 1 在线访问的组件是hbase 。一种使用hdfs底层存储的模型。…

CSS3盒模型

CSS3盒模型规定了网页元素的显示方式&#xff0c;包括大小、边框、边界和补白等概念。2015年4月&#xff0c;W3C的CSS工作组发布了CSS3基本用户接口模块&#xff0c;该模块负责控制与用户接口界面相关效果的呈现方式。 1、盒模型基础 在网页设计中&#xff0c;经常会听到内容…

DSP 开发例程(5): tcp_server

目录 DSP 开发例程(5): tcp_server创建工程源码编辑tcp_echo.chelloWorld.c 调试说明 DSP 开发例程(5): tcp_server 此例程实现在 EVM6678L 开发板上创建 TCP Server进程, 完成计算机与开发板之间的 TCP/IP 通信. 例程源码可从我的 gitee 仓库上克隆或下载. 点击 DSP 开发教程…

组件化npm包打包和使用

背景&#xff1a;本地环境对功能组件提取&#xff0c;开发环境下通过本地路径引用&#xff0c;发布模式下走npm包引用 1、项目下新建packages/HelloWorld文件夹&#xff0c;在此文件夹下运行终端 npm init 新建packages/HelloWorld/index.vue文件 新建packages/HelloWorld/ind…

「完美修复」concrt140.dll丢失的修复方法

concrt140.dll是一个动态链接库文件&#xff0c;它是Microsoft Visual C 2015 Redistributable的一部分。这个文件通常位于Windows系统的System32文件夹中&#xff0c;它提供了一些用于多线程编程的函数和类。当你在运行某些程序时&#xff0c;系统会调用这个文件中的函数来执行…

VR全景图片如何制作?揭秘VR全景图片制作全流程

引言&#xff1a; VR全景图片是一种以全景视角为基础的图片制作技术&#xff0c;能够呈现出更为真实、立体的视觉体验。通过VR全景图片&#xff0c;观众可以360环顾四周&#xff0c;仿佛身临其境&#xff0c;提供了一种全新的感官体验&#xff0c;那么如何制作出令人满意的全景…

数据库-用户权限管理

创建用户&#xff1a; create user testlocalhost identified by 123456; create user 创建用户的固定开头 testlocalhost test为用户名&#xff0c; localhost:新建用户可以在哪些主机上登录&#xff0c;即使可以使用IP地址&#xff0c;网段主机名都可以 identified by 1…

【AIFEM案例分析】药柱随机响应分析

AIFEM是由天洑自主研发的一款通用的智能结构仿真软件&#xff0c;助力用户解决固体结构相关的静力学、动力学、振动、热力学等实际工程问题&#xff0c;软件提供高效的前后处理工具和高精度的有限元求解器&#xff0c;帮助用户快速、深入地评估结构的力学性能&#xff0c;加速产…

PHP在线客服系统平台系统源码+完全开源 带完整的搭建教程

在线客服系统已经成为企业与用户进行实时沟通的重要工具。PHP作为一种流行的服务器端脚本语言&#xff0c;具有高效、稳定和易用性等优点&#xff0c;因此被广泛应用于在线客服系统的开发。今天罗峰来给大家介绍一款PHP在线客服系统平台系统源码&#xff0c;源码完全开源&#…

ChatGPT扩展系列之ChatExcel

文章目录 ChatGPT扩展系列之ChatExcel对某一列的文字进行处理对数据进行排序对数据进行计算微软官方又推出Excel AI插件ChatGPT扩展系列之ChatExcel 自从ChatGPT很空出世之后,很多基于ChatGPT的应用便如雨后春笋般应用而生,这些应用的底层本质就是利用了ChatGPT对自然语言的…

SpringCloud(五) Eureka与Nacos的区别

SpringCloud(二) Eureka注册中心的使用-CSDN博客 SpringCloud(四) Nacos注册中心-CSDN博客 在这两篇博文中我们详细讲解了Eureka和Nacos分别作为微服务的注册中心的使用方法和注意事项,但是两者之间也有一些区别. 一, Nacos实例分类 Nacos实例分为两种类型: 临时实例:如果实例…

解决proteus仿真stm32,IIC通讯,IIC DEBUG无法显示从机应答信号的问题(问题情况为在8位数据后应答位显示?)

1、错误现象 错误现象如下&#xff0c;在IIC数据传输8位数据后&#xff0c;IIC DEBUG的应答位无法显示应答位 2、错误原因 我们打开信号传输的示波器&#xff0c;直接去查看IIC从机校验位的数据波形&#xff0c;可以看到从机示波器显示的的波形为半高ACK&#xff0c;那错误原…

在python中加载tensorflow-probability模块和numpy模块

目录 操作步骤&#xff1a; 注意&#xff1a; 问题&#xff1a; 解决办法&#xff1a; 操作步骤&#xff1a; 在虚拟环境的文件夹中&#xff0c;找到Scripts文件夹&#xff0c;点击进去&#xff0c;找到地址栏&#xff0c;在地址栏中输入cmd&#xff0c;进入如下界面。 输…

[LeetCode]-27. 移除元素-26.删除有序数组中的重复项-88.合并两个有序数组

目录 27.移除元素 题目 思路 代码 26. 删除有序数组中的重复项 题目 思路 代码 88.合并两个有序数组 题目 思路 代码 总结 27.移除元素 27. 移除元素 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/remove-element/description/ 题目 给你一…

新建包含cuda和cudnn的docker

背景&#xff1a;服务器的cudnn版本太低了&#xff0c;没有权限去修改。故新建包含cuda和cudnn的docker 步骤 一、拉取镜像及创建docker 拉取相关的镜像 从镜像列表选出相关版本的镜像https://gitlab.com/nvidia/container-images/cuda/blob/master/doc/supported-tags.md …

在全新ubuntu上用gpu训练paddleocr模型遇到的坑与解决办法

目录 一. 我的ubuntu版本![在这里插入图片描述](https://img-blog.csdnimg.cn/297945917309494ab03b50764e6fb775.png)二.首先拉取paddleocr源代码三.下载模型四.训练前的准备1.在源代码文件夹里创造一个自己放东西的文件2.准备数据2.1数据标注2.2数据划分 3.改写yml配置文件4.…

皮肤渲染方法总结

一、皮肤次表面光照 HDRP用的延迟管线&#xff0c;镜面和散射分开进行计算 UE有透射开启和关闭的效果 &#xff08;一&#xff09;镜面反射 BRDF和Kelemen方法 &#xff08;二&#xff09;次表面散射与透射 1.散射&#xff1a;BRDF与BRSSDF&#xff08;从反射点附近的点进行…