Day07 C++STL入门基础知识四——vector容器(上) 基本概念-构造函数-赋值操作-容量大小【全面深度剖析+例题代码展示】

news2025/1/17 0:18:15

Leave no stone unturned. 竭尽全力

文章目录

  • 1. 基本概念
    • 1.1 功能
    • 1.2 与普通数组相同点与不同点
    • 1.3 动态扩展
  • 2. 构造函数
    • 2.1 功能描述
    • 2.2 函数原型
    • 2.3 代码展示
  • 3. 赋值操作
    • 3.1 函数原型
    • 3.2 代码展示
  • 4. 容量及大小
    • 4.1 函数原型
    • 4.2 代码展示
      • 4.2.1 `empty()`
        • 4.2.1.1 代码展示
        • 4.2.1.2 测试结果
      • 4.2.2 `capacity()`
        • 4.2.2.1 代码展示
        • 4.2.2.2 测试结果
      • 4.2.3 `size()`
        • 4.2.3.1 代码展示
        • 4.2.3.2 测试结果
      • 4.2.4 `resize()`
        • 4.2.4.1 基本用法
          • 4.2.4.1.1 代码展示
          • 4.2.4.1.2 测试结果
        • 4.2.4.2 重载函数
          • 4.2.4.2.2 代码展示
          • 4.2.4.2.2 测试结果
    • 4.3 深度思考
      • 4.3.1 思考1
        • 4.3.1.1 疑问
        • 4.3.1.2 测试
        • 4.3.1.3 解答
      • 4.3.2 思考2
        • 4.3.2.1 疑问
        • 4.3.2.2 解释
      • 4.3.3 思考3
        • 4.3.3.1 疑问
        • 4.3.3.2 解释
        • 4.3.3.3 举例展示
  • Thanks for everything!

1. 基本概念

1.1 功能

  • vector数据类型和数组非常相似,也称为单端数组

1.2 与普通数组相同点与不同点

  • 相同点: 都可以存取数据类型
  • 不同点: 数组是静态空间,给定空间范围后,最多只能存取固定的数值;而vector可以动态扩展,伴随输入值可以扩展内存空间【注意:如果插入数据超过容器容量,则不是在原有空间内扩展,而是直接换一个内存更大的空间进行存储

1.3 动态扩展

  • 并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放新空间
    在这里插入图片描述
  • vector容器的迭代器是支持随机访问的迭代器

2. 构造函数

2.1 功能描述

  • 创建vector容器

2.2 函数原型

  • vector<T> v; 采用模板实现类实现,默认构造函数
  • vector(v.begin(), v.end()); 将v[begin(), end())区间中的元素拷贝给本身【注意前闭后开!!!】
  • vector(n, elem); 构造函数将n个elem拷贝给本身
  • vector(const vector &vec); 拷贝构造函数

2.3 代码展示

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
//vector容器构造

void vectorPrint(vector<int> &v) {	//打印容器的函数
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << (*it) << " ";
	}
	cout << endl;
}

void text01() {	
	//	默认构造,无参构造
	vector<int> v;	
	for (int i = 0; i < 10; i++) {
		v.push_back(i);
	}
	vectorPrint(v);

	//通过区间方式进行构造,传入两个迭代器进行构造
	vector<int> v1(v.begin(), v.end());
	vectorPrint(v1);

	//n个elem方式构造
	vector<int> v2(10, 4); //第一个参数为个数,第二个参数为值
	vectorPrint(v2);

	//拷贝构造(重要!!!)
	vector<int> v3(v2);
	vectorPrint(v3);
}

int main() {
	text01();
}

在这里插入图片描述

3. 赋值操作

3.1 函数原型

  • vector& operator=(const vector &vec); 重载等号操作符
  • assign(begin, end); 将[begin, end)区间中的数据拷贝赋值给本身
  • assign(n, elem); 将n个elem拷贝赋值给本身

3.2 代码展示

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;

void vectorPrint(vector<int> &v) {	//打印容器的函数
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << (*it) << " ";
	}
	cout << endl;
}

//vector容器赋值操作
void text01() {
	vector<int> v1;
	for (int i = 0; i < 10; i++) {
		v1.push_back(i);
	}
	vectorPrint(v1);
	
	//operator的"="赋值
	vector<int>v2 = v1;
	vectorPrint(v2);

	//assign赋值
	vector<int>v3;
	v3.assign(v1.begin(), v1.end());	//提供两个迭代器,一个指向起始数据(可以取到),另一个指向结束数据(取不到)
	vectorPrint(v3);

	//n个elem方式赋值
	vector<int>v4;
	v4.assign(10, 8);
	vectorPrint(v4);
}
int main() {
	text01();

	return 0;
}

在这里插入图片描述

4. 容量及大小

4.1 函数原型

  • empty(); 判断容器是否为空
    • 如果为空,则返回true
    • 不为空,则返回false
  • capacity 容器的容量
  • size() 返回容器元素中的个数
  • resize(int num); 重新指定容器的长度为num,若容器变长,则以默认值0填充新的位置;如果容器变短,则末尾超出容器长度的元素被删除
  • resize(int num, elem); 重新定义容器的长度为num,若容器变长,则以elem值填充新位置;如果容器变短,则末尾超出容器长度的元素被删除

4.2 代码展示

4.2.1 empty()

4.2.1.1 代码展示

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
void vectorPrint(vector<int>& v) {	//打印容器的函数
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << (*it) << " ";
	}
	cout << endl;
}
void text02() {
	vector<int> v1;
	for (int i = 0; i < 10; i++) {
		v1.push_back(i);
	}
	vectorPrint(v1);
	
	//判断是否为空 【空->true    非空->false】
	if (v1.empty()) cout << "v1为空" << endl;
	else cout << "v1不为空" << endl;
}

int main() {
	text02();
	return 0;
}

4.2.1.2 测试结果

在这里插入图片描述

4.2.2 capacity()

4.2.2.1 代码展示

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
void vectorPrint(vector<int>& v) {	//打印容器的函数
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << (*it) << " ";
	}
	cout << endl;
}
void text03() {
	vector<int> v;
	for (int i = 0; i < 10; i++) {
		v.push_back(i);
	}
	vectorPrint(v);
	int cap = v.capacity();
	cout << "容器的容量为:" << cap << endl;
}

int main() {
	text03();
	return 0;
}

4.2.2.2 测试结果

在这里插入图片描述

4.2.3 size()

4.2.3.1 代码展示

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
void vectorPrint(vector<int>& v) {	//打印容器的函数
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << (*it) << " ";
	}
	cout << endl;
}
void text04() {
	vector<int> v;
	for (int i = 0; i < 10; i++) {
		v.push_back(i);
	}
	vectorPrint(v);
	int size = v.size();
	cout << "容器的大小(容器中元素的个数)为:" << size << endl;
}

int main() {
	text04();
	return 0;
}

4.2.3.2 测试结果

在这里插入图片描述

4.2.4 resize()

4.2.4.1 基本用法

4.2.4.1.1 代码展示
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
void vectorPrint(vector<int>& v) {	//打印容器的函数
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << (*it) << " ";
	}
	cout << endl;
}
void text05() {
	vector<int> v;
	for (int i = 0; i < 10; i++) {
		v.push_back(i);
	}
	vectorPrint(v);
	v.resize(15);
	vectorPrint(v);
	//如果重新指定的比原来长了,默认用0填充新的位置
	v.resize(6);
	vectorPrint(v);
	//如果重新指定的比原来短了,则末尾超出容器长度的元素将会被删除 
}
int main() {
	text05();
	return 0;
}

4.2.4.1.2 测试结果

在这里插入图片描述

4.2.4.2 重载函数

  • 利用重载版本,可以指定参数2为默认填充值
4.2.4.2.2 代码展示
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
void vectorPrint(vector<int>& v) {	//打印容器的函数
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << (*it) << " ";
	}
	cout << endl;
}
void text06() {
	vector<int> v;
	for (int i = 0; i < 10; i++) {
		v.push_back(i);
	}
	vectorPrint(v);
	v.resize(15,111); //利用重载版本,可以指定参数2为默认填充值
	vectorPrint(v);
	//如果重新指定的比原来长了,默认用111填充新的位置
	v.resize(6);
	vectorPrint(v);
	//如果重新指定的比原来短了,则末尾超出容器长度的元素将会被删除 
}
int main() {
	text06();
	return 0;
}
4.2.4.2.2 测试结果

在这里插入图片描述

4.3 深度思考

4.3.1 思考1

4.3.1.1 疑问

如果插入10个数,那vector的容器的内存空间会刚好是10嘛?还是会大于是10?是个定值还是是随机的数捏?

4.3.1.2 测试

我们不妨写一下代码,检测一下:

//Day03 vector容器的容量和大小操作
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
void vectorPrint(vector<int>& v) {	//打印容器的函数
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << (*it) << " ";
	}
	cout << endl;
}
//vector容器的容量和大小操作
void text01() {
	vector<int> v1;
	for (int i = 0; i < 10; i++) {
		v1.push_back(i);
	}
	vectorPrint(v1);
	int cap=v1.capacity();
	cout << "容量为:" << cap << endl;
}
int main() {
	text01();
	return 0;
}

在这里插入图片描述

4.3.1.3 解答

答案是13。原因就是vector容器具有自动扩展的特性,使得容器的容量值总大于等于容器的大小(存入值的个数)

4.3.2 思考2

4.3.2.1 疑问

如果在已存入一些值的容器中,再插入一些数据,在已经达到容器容量的情况下,还会自动在容器末插入数据嘛???

4.3.2.2 解释

假设还是存入10个数值,原容器则会开辟出13个内存空间,剩余3个空间;如果再插入3个以上的数据,使容器大小>容器容量,则会重新开辟一个内存空间更大的容器,重新存储
在这里插入图片描述

4.3.3 思考3

4.3.3.1 疑问

容器的容量指的是容器的全部内存嘛???

4.3.3.2 解释

注意:vector容器中capacity并非显示的是vector真正所占用的空间,vector类本身用sizeof函数返回字节,是容器本身的占用空间,而用函数开辟的空间,被容器在堆中开辟的内存,不会影响容器本身的占用!要想获得容器的全部内存,需要用(sizeof(容器)+容器().capacity())计算!vs为1.5倍扩容,所以当插入10个数时内存空间扩到13,全部内存为29

4.3.3.3 举例展示

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
void vectorPrint(vector<int>& v) {	//打印容器的函数
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {
		cout << (*it) << " ";
	}
	cout << endl;
}
//vector容器的容量和大小操作
void text01() {
	vector<int> v1;
	for (int i = 0; i < 10; i++) {
		v1.push_back(i);
	}
	vectorPrint(v1);
	int cap=v1.capacity();
	cout << "容量为:" << cap << endl;
	int all_cap = v1.capacity() + sizeof(v1);
	cout << all_cap << endl;
}
int main() {
	text01();
	return 0;
}

在这里插入图片描述

Thanks for everything!

在这里插入图片描述

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

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

相关文章

恶意代码分析实战 1 静态分析基础技术

1.1 Lab 1-1 对Lab01-01.exe和Lab01-01.dll进行分析 问题 将文件上传至http://www.VirusTotal.com进行分析并查看报告。文件匹配到了已有的反病毒软件特征吗? 首先查看Lab-01-01.exe。 然后查看Lab01-01.dll。 这两个文件应该都是恶意文件。 这些文件是什么时候编译的?…

20230125英语学习

Office Buzzwords You’re Using That Annoy All Your Co-workers 说话之道&#xff1a;避开办公室行话的“雷区” Joining a new office means having to learn how to communicate with your team.But in order to do that well, it sometimes means having to learn your …

索引优化示例

目录 1.单表优化 2.两表优化 3.三表优化 4.总结 1.单表优化 创建索引前 (1)先按照where条件创建索引 按照查询条件中的三个项目创建索引&#xff0c;并且索引中的项目存在顺序&#xff0c;分别是1,2和3。 (2)创建索引 type 变成了 range,这是可以忍受的。但是 extra 里使用…

恶意代码分析实战 4 识别汇编中的C代码结构

4.1 Lab06-01.exe 由main函数调用的唯一子过程中发现的主要代码结构是什么&#xff1f; 使用Strings进行查看&#xff0c;需要注意最后的这两个字符串&#xff0c;一个是“没有网”&#xff0c;另一个是“联网成功”。 IDA 中查看图结构。 明显是if-else结构。 位于0x4010…

进程间通信/管道/消息队列/共享内存/信号量

本文重点目标&#xff1a; ⭐进程间通信介绍⭐ ⭐管道⭐ ⭐消息队列⭐ ⭐共享内存⭐ ⭐信号量⭐ 1.进程间通信介绍 什么是通信&#xff1f; 通信指的是数据传输、资源共享、通知事件和进程控制。 ①数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程 ②资源共享&a…

【GIS】高分辨率遥感影像智能解译

1 绪论 随着航空科技工业的不断成熟与发展&#xff0c;我国遥感卫星研制能力不断攀升&#xff0c;发射数量逐年提高&#xff0c;在轨运行的遥感卫星为社会生产及居民日常生活提供了巨大的支持与便利。我国目前同时在轨运行的遥感卫星数量已超过60颗&#xff0c;每天获取并传回…

LeetCode[990]等式方程式的可满足性

难度&#xff1a;中等题目&#xff1a;给定一个由表示变量之间关系的字符串方程组成的数组&#xff0c;每个字符串方程 equations[i]的长度为 4&#xff0c;并采用两种不同的形式之一&#xff1a;"ab"或 "a!b"。在这里&#xff0c;a 和 b 是小写字母&#…

【Python学习003】高效数据结构-列表

【Python学习003】高效数据结构-列表 我们的公众号是【朝阳三只大明白】&#xff0c;满满全是干货&#xff0c;分享近期的学习知识以及个人总结&#xff08;包括读研和IT&#xff09;&#xff0c;希望大家一起努力&#xff0c;一起加油&#xff01;求关注&#xff01;&#xf…

浏览器使用本地硬盘上的JS文档

网页通过<script>标记可以引入在线的js文档&#xff0c;只有把网页保存在本地硬盘才能使用相对路径引入本地js文档&#xff0c;普通浏览器难以实现在线页面上引入本地js文档。怎么解决这个问题呢&#xff1f;首先准备好需要引入的JS文档&#xff0c;可以是成熟的JS库&…

【docker概念和实践 4】(3)本地镜像提交到阿里云

一、说明 本篇讲述如何将自己制作的容器转化成镜像&#xff0c;再将镜像推送到远端阿里云上。 二、制造一个本地容器 2.1 从远端仓库拉取ubuntu镜像 使用镜像拉取语句&#xff1a; docker pull ubuntu:20.04 docker run -it ubuntu&#xff1a;20.04 bash 通过以上两句&…

LeetCode[200]岛屿数量

难度&#xff1a;中等题目&#xff1a;给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外&am…

5-4中央处理器-控制器的功能和工作原理

文章目录一.控制器的结构和功能二.硬布线控制器1.硬布线控制单元图2.微操作命令分析3.CPU的控制方式&#xff08;1&#xff09;同步控制方式&#xff08;2&#xff09;异步控制方式&#xff08;3&#xff09;联合控制方式4.硬布线控制单元的设计步骤&#xff08;1&#xff09;分…

qsort函数用法 + 模拟实现qsort函数

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前是C语言学习者 ✈️专栏&#xff1a;【C/C】算法 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞…

论文笔记目录(ver2.0)

1 时间序列 1.1 时间序列预测 论文名称来源主要内容论文笔记&#xff1a;DCRNN &#xff08;Diffusion Convolutional Recurrent Neural Network: Data-Driven Traffic Forecasting&#xff09;_UQI-LIUWJ的博客-CSDN博客iclr 2017使用双向扩散卷积GRU&#xff0c;建模空间和…

目标跟踪心得篇五:MOT数据集标注、TrackEval的使用、DarkLabel不能自动跟踪解决方案及如何在MMTracking上输出跟踪评测

跟踪方向的标注成本非常很大的 ,那么我们如何尽可能一次性弄好呢? 所选标注工具:DarkLabel DarkLabel是一个轻量的视频标注软件,尤其做MOT任务非常友好,其标注可以通过脚本转化为标准的目标检测数据集格式、ReID数据集格式和MOT数据集格式。 使用之前: darklabel.yml:保…

传参的理解

前言 当我们调用函数的时候&#xff0c;参数是怎么传递给被调用方的&#xff0c;有想过这个问题吗&#xff1f;传递不同大小的参数对调用方式有影响吗&#xff1f;本文将带你探究这些问题&#xff0c;阅读本文需要对函数栈帧有一定的理解&#xff0c;并了解基本的汇编指令。 …

傅一平:2022年我的私人书单

2022年过去了&#xff0c;推荐我的TOP 10 书单&#xff0c;同时附上我的一句话评语和豆瓣的评分&#xff0c;这些书代表了我学习的方向&#xff0c;包括学习方法、思考方法、数据治理、数字化转型、系统架构、职场管理、个人修养、生活态度等。TOP 1 学习究竟是什么一句话评语…

【Ajax】HTTP超文本传输协议

一、HTTP协议简介什么是通信通信&#xff0c;就是信息的传递和交换。通信三要素&#xff1a;通信的主体通信的内容通信的方式1.1 现实生活中的通信案例&#xff1a;张三要把自己考清北大学的好消息写信告诉自己的好朋友李四。其中&#xff1a;通信的主体是张三和李四&#xff1…

Linux网络:应用层之HTTP协议

文章目录一、应用层1.协议2.网络版计算器二、HTTP 协议1. URL2. HTTP 协议格式3.查看 HTTP 请求4.发送 HTTP 响应5. HTTP 的方法6. HTTP 的状态码7. HTTP 的版本8. HTTP 常见 Header9. Cookie 与 session三、HTTP 与 HTTPS一、应用层 我们程序员写的一个个解决实际问题&#x…

jvm 堆 栈中存什么?

数据类型 Java虚拟机中&#xff0c;数据类型可以分为两类&#xff1a;基本类型和引用类型。基本类型的变量保存原始值&#xff0c;即&#xff1a;他代表的 值就是数值本身&#xff1b;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用&#xff0c;而不是对象本身&…