【C++】vector(1)

在这里插入图片描述

😈个人主页: 起名字真南
😈个人专栏:【数据结构初阶】 【C语言】 【C++】

请添加图片描述

目录

  • 引言
  • 1 vector 的基本知识
    • 1.1 vector 的特点
  • 2 vector 的主要功能和操作
    • 2.1 vector 的构造
    • 2.2 vector 的增删改查
    • 2.3 vector 的容量

引言

在C++的标准模板库(STL)中,vector 是最常用的容器之一。它提供了一个动态数组,允许我们高效地存储和管理大量的数据。相比于传统的 C 风格数组,vector 不仅支持动态扩展,还具备了丰富的成员函数用于操作数据,使得程序更加简洁和高效。在本篇文章中,我们将深入探讨 C++ vector 的实现原理、常见的用法,并通过具体的代码示例展示其在实际应用中的作用。

1 vector 的基本知识

std::vector 是一个动态数组容器,与 C 语言的数组不同,vector 的大小可以动态扩展或缩减。它可以方便地插入、删除、访问和管理元素,并且具备强大的内存管理功能。

vector 基础知识以及相关资料

1.1 vector 的特点

  • 动态扩展:在需要时vector可以动态开辟自己的内存,这点区别于静态数组
  • 连续内存:vector 是STL中的数组容器,其在内存中的存储都是连续的所以可以通过下标访问
  • 迭代器支持:vector 支持通过迭代器进行遍历循环整个容器
  • 自动内存管理 :vector 会自动管理自己的内存,如果空间不够则会自己开辟空间,当元素被删除时vector也会释放不在使用的内存

2 vector 的主要功能和操作

2.1 vector 的构造

构造函数声明接口说明
vector()无参构造
vector(size_type n, const value_type& val = value_type())构造并初始化 nval
vector(const vector& x)拷贝构造
vector(InputIterator first, InputIterator last)使用迭代器进行初始化构造

代码演示:

#include<iostream>
#include<vector>
using namespace std;int main()
{//创建一个空的vector v1vector<int> v1;//创建一个有十个数据并且初始化都为9的vector v2vector<int> v2(10, 9);//拷贝构造vector<int> v3(v2);//使用迭代器进行构造vector<int> v4(v2.begin(), v2.end());return 0;
}

调试结果:
在这里插入图片描述
如果我们想通过控制台来直观的看到每个vector的存储情况应该怎么做呢?

	cout << "v1 :";for (auto it : v1){cout << it << " ";}cout << endl;cout << "v2 :";for (auto it : v2){cout << it << " ";}cout << endl;cout << "v3 :";for (auto it : v3){cout << it << " ";}cout << endl;cout << "v4 :";for (auto it : v4){cout << it << " ";}cout << endl;return 0;

因为vector支持迭代器遍历循环数组所以我们可以通过迭代器大打印出数组中的所有元素
输出结果:
在这里插入图片描述

2.2 vector 的增删改查

vector增删查改接口说明
push_back(const value_type& val)尾插
pop_back(const value_type& val)尾删
find(InputIterator first, InputIterator last, const T& val)查找。(注意这个是算法模块实现,不是vector的成员接口)
insert(iterator position, const value_type& val)在position之前插入val
erase(const_iterator position)删除position位置的数据
swap(vector& x)交换两个vector的数据空间
operator[]像数组一样访问

代码演示:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);v1.push_back(5);for (auto it : v1){cout << it << " ";}cout << endl;v1.pop_back();v1.pop_back();v1.pop_back();for (auto it : v1){cout << it << " ";}cout << endl;//auto it = find(v1.begin(), v1.end(), 2);//cout << "insert:";//cout << *it << endl;//v1.insert(it, 6);//for (auto it : v1)//{//	cout << it << " ";//}//cout << endl;//cout << "find:";//auto i = find(v1.begin(), v1.end(), 2);//v1.erase(i);//for (auto i : v1)//{//	cout << i << " ";//}//cout << endl;vector<int> v2(5, 5);vector<int> v3(6, 6);cout << "v2 :";for (int i = 0; i < 5; i++){cout << v2[i];}cout << endl;cout << "v3 :";for (int i = 0; i < 6; i++){cout << v3[i];}cout << endl;v2.swap(v3);cout << "swap" << endl;cout << "v2 :" ;for (int i = 0; i < 6; i++){cout << v2[i];}cout << endl;cout << "v3 :";for (int i = 0; i < 5; i++){cout << v3[i];}return 0;
}

我们在使用find函数的时候使用的不是vector的成员函数,而是算法库**(algorithm)**实现的返回的是目标元素的迭代器,我们在使用迭代器进行操作的时候会涉及到迭代器失效的问题这个我们后续会讲,目前只是演示成员函数的使用方法以及使用后在控制台的输出。
输出结果:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.3 vector 的容量

容量空间接口说明
size()返回当前存储的数据个数,即 vector 中实际使用的元素个数
capacity()获取当前分配的内存容量,表示 vector 在不需要重新分配内存的情况下可以存储的最大元素数量
empty()判断容器是否为空,如果 size() 为 0,则返回 true
resize()改变 vector 的大小。如果新大小比当前大,则添加新元素;如果小,则删除多余元素。注意,resize() 也可能触发内存重新分配
reserve()预留指定的容量,不改变 size(),但可能会增加 capacity(),从而减少未来的内存分配次数,提高性能

代码演示:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{vector<int> v1(10, 0);vector<int> v2(1);cout << "v1.size() :" << v1.size() << endl;cout << "v2.size() :" << v2.size() << endl;cout << "v1.capacity() :" << v1.capacity() << endl;cout << "v2.capacity() :" << v2.capacity() << endl;vector<int> v3();if (v1.empty()){cout << "false" << endl;}else{cout << "true" << endl;}v1.resize(20);v2.resize(5);cout << "v1.resize() :" << v1.size() << endl;cout << "v2.resize() :" << v2.size() << endl;v1.reserve(21);v2.reserve(6);cout << "v1.reserve() :" << v1.capacity() << endl;cout << "v2.reserve() :" << v2.capacity() << endl;return 0;
}

输出结果:
在这里插入图片描述

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

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

相关文章

MySQL——数据库

什么是数据库 数据库&#xff08;DB , DataBase&#xff09;概念&#xff1a;数据仓库&#xff0c;软件&#xff0c;安装在操作系统&#xff08;window&#xff0c;linux&#xff0c;max&#xff0c;...&#xff09;之上学习数据库最重要的就是学习SQL语句存储500万以下的数据…

鸿蒙HarmonyOS————ArkTs介绍(1)

最近除了人工智能&#xff0c;还有一个很火的HarmonyOS&#xff0c;HarmonyOS是华为公司开发的一款面向全场景的分布式操作系统&#xff0c;旨在为消费者提供跨设备无缝协同体验。它支持多种智能终端设备&#xff0c;包括但不限于智能手机、平板电脑、智能穿戴设备、智能家居设…

<Project-11 Calculator> 计算器 0.3 年龄计算器 age Calculator HTML JS

灵感 给工人发工资是按小时计算的&#xff0c;每次都要上网&#xff0c;我比较喜欢用 Hours Calculator &#xff0c;也喜欢它的其它的功能&#xff0c; 做个类似的。 我以为是 Python&#xff0c;结果在学 javascript 看 HTML&#xff0c;页面的基础还停留在 Frontpage 2000…

【学术论文投稿】自动化运维:解锁高效运维的密钥

【连续三届IEEE出版|EI检索】第三届图像处理、计算机视觉与机器学习国际学术会议&#xff08;ICICML 2024&#xff09;_艾思科蓝_学术一站式服务平台 更多学术会议请看&#xff1a;https://ais.cn/u/nuyAF3 目录 引言 一、自动化运维概述 1. 自动化运维的定义 2. 自动化运…

Qt中使用线程之QRunnable

1、自定义1个子类继承自QRunnable 2、重写run方法&#xff0c;编写子线程的业务逻辑 3、使用QThreadPool的全局方法来开启这个线程 4、线程的回收不需要关注&#xff0c;由QThreadPool处理 5、缺点&#xff1a;无法使用信号槽机制 6、适合一些不需要和主线程通信的耗时的任…

SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载

文章目录 前言一、控制器层代码二、服务层代码三、代码亮点分析 前言 SpringBoot的同步excel导出方式中&#xff0c;服务会阻塞直到Excel文件生成完毕&#xff0c;如果导出数据很多时&#xff0c;效率低体验差。有效的方案是将导出数据拆分后利用CompletableFuture&#xff0c;…

【图论】(四)最小生成树与拓扑排序

最小生成树与拓扑排序 最小生成树之prim&#xff08;P算法&#xff09;相关概念结题思路拓展 最小生成树之kruska&#xff08;K算法&#xff09;过程模拟程序实现拓展 拓扑排序背景与思路模拟过程程序实现 最小生成树之prim&#xff08;P算法&#xff09; 相关概念 P算法是用…

『完整代码』坐骑召唤

创建一个按钮 作为召唤/消失坐骑的开关 将预制体放入指定文件夹 命名为Mount01 创建脚本并编写&#xff1a;CallMount.cs using UnityEngine; using UnityEngine.UI; public class CallMount : MonoBehaviour{public Button callBtn;GameObject mountPrefab;GameObject mountIn…

CentOS7 上安装GitLab的经历

一、安装必要的基础环境 1.安装依赖包 [rootgitlab-server ~]#yum install curl policycoreutils openssh-server openssh-clients postfix wget git patch -y [rootgitlab-server ~]# systemctl start postfix 2.配置yum源(由于网络问题&#xff0c;国内用户请使用清华大学…

导数的概念及在模型算法中的应用

一. 导数概念与计算 1. 导数的物理意义&#xff1a; 瞬时速率。一般的&#xff0c;函数yf(x)在x处的瞬时变化率是 2. 导数的几何意义&#xff1a; 曲线的切线&#xff0c;当点趋近于P时&#xff0c;直线 PT 与曲线相切。容易知道&#xff0c;割线的斜率是当点趋近于 P 时&…

数字孪生:引领智慧农业的未来

在现代农业中&#xff0c;数字化与智能化的浪潮正在改变传统的种植方式。数字孪生技术作为一种创新的数字化解决方案&#xff0c;正在深刻改变智慧农业的面貌&#xff0c;尤其是在大棚智能控制、数据全面可视、加工过程监控和物流运输溯源等方面展现出巨大的潜力。 frontop数字…

【动手学深度学习】8.1. 序列模型(个人向笔记)

想象一下有人正在看网飞&#xff08;Netflix&#xff0c;一个国外的视频网站&#xff09;上的电影。 一名忠实的用户会对每一部电影都给出评价&#xff0c; 毕竟一部好电影需要更多的支持和认可。 然而事实证明&#xff0c;事情并不那么简单。 随着时间的推移&#xff0c;人们对…

《Python基础教程》笔记(ch0-1)

前言 在Python生态系统中&#xff0c;各种包轮番登场&#xff0c;各种编码实践大行其道后又日渐式微。 引言 Python是什么&#xff1f;为何要使用它&#xff1f;官方宣传说&#xff1a;Python是一种面向对象的解释性高级编程语言&#xff0c;具有动态语义。 这句话的要点在…

监控易DEMO功能深度解析:运维行业的智能化转型新助力

在数字化转型的浪潮中&#xff0c;运维行业正面临着前所未有的变革与挑战。为了应对日益复杂的IT架构和不断提升的运维需求&#xff0c;监控易的集中式跨平台一体化监控软件不断升级优化&#xff0c;以适应新的运维环境。本文将对监控易DEMO的功能进行深度解析&#xff0c;探讨…

简单介绍冯诺依曼体系

现代的计算机, 大多遵守冯诺依曼体系结构 CPU中央处理器&#xff1a;进行算术运算和逻辑判断。存储器&#xff1a;分为外存和内存&#xff0c;用于存储数据&#xff08;使用二进制方式存储&#xff09;。输入设备&#xff1a;用户给计算机发号施令。输出设备&#xff1a;计算机…

Hadoop生态圈三大组件:HDFS的读写流程、MapReduce计算流程、Yarn资源调度

文章目录 1. HDFS的读写流程1.1 HDFS读流程1.2 HDFS写流程 2. MapReduce计算流程3. Yarn资源调度一、客户端请求资源二、Resource Manager处理请求三、任务资源计算与申请四、Resource Manager分配资源五、Node Manager执行任务六、任务执行与监控 1. HDFS的读写流程 1.1 HDFS…

沃德商协会管理系统小程序源码

商协会管理系统小程序&#xff0c;作为新一代数字化商协会运营管理的先锋工具&#xff0c;其核心围绕“智慧化会员体系、智敏化内容运营、智能化活动构建”三大核心板块精心构建。这一系统通过智慧化会员体系&#xff0c;实现了会员信息的精准管理与高效互动&#xff0c;不仅简…

2024_E_100_连续字母长度

连续字母长度 题目描述 给定一个字符串&#xff0c;只包含大写字母&#xff0c;求在包含同一字母的子串中&#xff0c;长度第 k 长的子串的长度&#xff0c;相同字母只取最长的那个子串。 输入描述 第一行有一个子串(1<长度<100)&#xff0c;只包含大写字母。 第二行为…

Rancher2.6管理k8s1.23

Rancher2.6管理k8s1.23 简介Rancher和k8s的区别 安装rancher初始化实验环境新增hosts文件条目安装docker 安装Rancher登录Rancher平台 通过Rancher仪表盘管理k8s集群&#xff1a;部署tomcat服务创建Ingress资源创建ingress规则 简介 Rancher是一个开源的企业级多集群Kubernete…

HarmonyOS 开发知识总结

1. HarmonyOS 开发知识总结 1.1. resources->base->media中不可以新建文件夹&#xff1f; 项目图片路径resources->base->media中不可以新建文件夹&#xff0c;图片全平级放里面&#xff0c;查找图片不方便&#xff0c;有没有什么其他的办法解决这个难点&#xff…