C++静态数组的用法

每日诗词:

疏影横斜水清浅,暗香浮动月黄昏。

                                                           ——《山园小梅·其一》林逋


目录

数组的基础操作:

数组元素的增加:

演示:

数组元素的删除:

 演示:

数组元素的访问和修改:

演示:

数组元素的查找

代码演示: 

下期预告:C++的二维数组


我们在学习C语言的过程中也不能忘却了汉字美,所以从这篇之后我都会附上一句或一首的古诗词供大家欣赏。

现在我们就来看看数组的基本用法(增,删,改,查)

数组的基础操作:

数组元素的增加:

对数组元素的添加有两种形式:一种是在数组的末尾添加元素:第二种是在数组序列中直接插入元素。

如上图就是直接在数组的结尾添加一个元素,这不影响整个数组,这样的处理时间最短。

 这个就是第二种方式;直接在数组中间插入一个元素,这样做会影响插入之后的元素,影响较大,处理时间较长。

演示:

在C++中,固定大小的数组(静态数组)(如int arr[10];)在声明时其大小就已经确定,并且不支持直接添加元素的操作,因为数组的内存是连续分配的,并且其大小在编译时就已确定。

如果你需要动态地添加元素,你应该考虑使用动态数组,如std::vector。std::vector是一个能够自动管理存储空间的模板类,它提供了在运行时动态增加或减少元素的功能。

以下是使用std::vector添加元素的示例:
 

#include <vector>
#include <iostream>int main() {std::vector<int> vec = {1, 2, 3, 4, 5}; // 初始化为包含5个元素的vector// 向vector末尾添加一个元素vec.push_back(6);// 现在vec包含6个元素for (int num : vec) {std::cout << num << " ";}// 输出:1 2 3 4 5 6// 如果你知道要插入的位置,并且想要在那个位置插入一个新元素(而不是在末尾),// 你可以使用insert函数。但是请注意,这会移动该位置之后的所有元素。vec.insert(vec.begin() + 2, 3.5); // 注意:这里尝试插入一个float,但vector是int类型,这会导致编译错误// 正确的做法是插入相同类型的元素,比如再插入一个3(如果这是你想要的)vec.insert(vec.begin() + 2, 3);// 现在vec包含7个元素,其中第二个3位于索引2的位置for (int num : vec) {std::cout << num << " ";}// 输出:1 2 3 3 4 5 6return 0;
}

请注意,在上面的代码中,我尝试插入一个float类型的值到int类型的vector中,这会导致编译错误。你应该始终插入与vector元素类型相同的值。

如果你确实需要使用固定大小的数组,并且需要在不改变数组大小的情况下“添加”元素,那么你可能需要重新考虑你的数据结构或算法。一种可能的方法是使用一个足够大的数组来存储可能需要的所有元素,并在逻辑上只使用其中的一部分。然而,这种方法并不灵活,因为它要求你提前知道可能需要存储的元素的最大数量。另一种方法是使用链表或动态分配的数组(如通过new操作符),但这将需要你自己管理内存。然而,在大多数情况下,使用std::vector会是更好的选择。

对于这个vector的动态数组我会在下期内容说到。有些对于静态数组要遵守的规则,在动态数组中可以不用理会,动态数组的自由度十分的高。


数组元素的删除:

同样,数组的删除也是有两种类型

 演示:

在C++中,数组(特别是固定大小的数组)本身并不支持直接删除元素的操作,因为数组的大小在声明时就确定了,且其元素在内存中是连续存储的。不过,我们可以通过一些方法来模拟“删除”操作:

1.覆盖法:将要删除的元素之后的所有元素都向前移动一位,覆盖掉要删除的元素。这样,虽然数组的大小没有变,但看起来就像是删除了那个元素。

2.使用动态数组:比如std::vector,它提供了erase成员函数来删除元素,并且可以自动调整大小。

举个例子,如果你有一个整型数组int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};,并且你想删除索引为3的元素(即值为4的元素),你可以这样做(使用覆盖法):
 

for (int i = 3; i < 9; i++) { // 假设数组未满,且要删除的元素不是最后一个arr[i] = arr[i + 1];
}
// 现在arr变成了{1, 2, 3, 5, 6, 7, 8, 9, 10, 10}(最后一个元素是重复的,或者你可以将其设置为某个特殊值表示无效)
// 注意:如果数组是满的,或者要删除的是最后一个元素,这种方法需要额外处理

然而,更推荐的做法是使用std::vector,因为它提供了更灵活和安全的操作方式:
 

#include <vector>
#include <iostream>int main() {std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};vec.erase(vec.begin() + 3); // 删除索引为3的元素for (int num : vec) {std::cout << num << " ";}// 输出:1 2 3 5 6 7 8 9 10return 0;
}

这样,你就可以很方便地删除std::vector中的元素了。

在C++中,如果你使用的是固定大小的数组(比如int arr[10];),你不能直接“删除”数组中的最后一个元素,因为数组的大小在声明时就确定了,并且元素在内存中是连续存储的。

如果你使用的是std::vector,那么删除最后一个元素就变得非常简单了。你可以使用pop_back成员函数来移除vector的最后一个元素,并且vector会自动调整其大小。

下面是使用std::vector删除最后一个元素的示例:

#include <vector>
#include <iostream>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 打印删除前的vectorfor (int num : vec) {std::cout << num << " ";}std::cout << std::endl;// 删除最后一个元素vec.pop_back();// 打印删除后的vectorfor (int num : vec) {std::cout << num << " ";}// 输出:1 2 3 4return 0;
}

数组元素的访问和修改:

访问数组的元素。

有两种的访问方式:

我们可以直接用a[]的方式访问。

比如:

  1. 直接访问:cout<<a[2]=5<<endl;这就是对数组元素第二个的访问。
  2. 指针方式访问:int*p=a;  *(p+2)=5;这也是访问,甚至还对第二个元素进行了改动。
演示:
#include <iostream>int main() {int arr[5] = {1, 2, 3, 4, 5}; // 声明并初始化一个包含5个整数的数组// 修改索引为2的元素(即第三个元素,因为索引从0开始)arr[2] = 10;// 打印修改后的数组内容,以验证修改for (int i = 0; i < 5; i++) {std::cout << arr[i] << " ";}// 输出:1 2 10 4 5return 0;
}

数组元素的查找

找到那个元素对应的下标,也可以找到下标对应的元素(就是访问)。

 

代码演示: 
#include <iostream>
using namespace std;
int main() {int arr[5] = {1, 2, 3, 4, 5}; // 声明并初始化一个包含5个整数的数组int len=sizeof(arr)/sizeof(arr[]);//得到数组容量for (int i = 0; i < len; ++i) 
{if(arr[i]==3)return i;
}return 0;
}

 上面代码就是查找的实例,十分的简单。我们只需要用循环遍历数组就可以查找到想要的那个元素的下标。后期我们就可以利用这一基本原理写函数来计算。


🆗到这里,这篇关于C++数组的基础用法就说完了,求一个免费的赞,感谢阅读,我们下期见。

下期预告:C++的二维数组

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

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

相关文章

WLAN射频调优

射频调优的基本原则 信道优化的基本原则 2.4G射频在非高密部署场景中推荐采用1、6、11这种3个不重叠的信道进行规划&#xff0c;同理也可以选用2、7、12或3、8、13的组合方式&#xff1b;在高密部署场景中则推荐采用1、5、9、13共4个信道组合进行规划。5G射频推荐采用36、40、…

HQChart使用教程101-创建内置键盘精灵

HQChart使用教程101-创建内置键盘精灵 键盘精灵步骤1. 创建键盘精灵实例2. 设置事件回调3. 初始化键盘精灵4. 设置码表数据5. 监听"keydown","mousedown" 交流QQ群HQChart代码地址键盘精灵源码 完整实例 键盘精灵 键盘精灵是一种便捷操作软件的功能工具&a…

【人工智能】Python融合机器学习、深度学习和微服务的创新之路

1. &#x1f680; 引言1.1 &#x1f680; 人工智能的现状与发展趋势1.2 &#x1f4dc; 机器学习、深度学习和神经网络的基本概念1.3 &#x1f3c6; 微服务架构在人工智能中的作用 2. &#x1f50d; 机器学习的演变与创新2.1 &#x1f31f; 机器学习的历史回顾2.2 &#x1f9e0;…

UE----IPA 安装 在手机上后 显示 不受信任的开发者

进入设置 ----》 点击 通用 ----》点击 VPN与设备管理 点击信任 然后 再打开开发者模式即可 在隐私与安全性里 下滑 最底部 即可看到开发者模式

JavaScript学习笔记(十二):JS Web API

1、Web API - 简介 Web API 是开发人员的梦想。 它可以扩展浏览器的功能它可以极大简化复杂的功能它可以为复杂的代码提供简单的语法 1.1 什么是 Web API&#xff1f; API 指的是应用程序编程接口&#xff08;Application Programming Interface&#xff09;。 Web API 是 …

机器学习第十四章-概率图模型

目录 14.1 隐马尔可夫模型 14.2马尔科夫随机场 14.3条件随机场 14.4学习与推断 14.4.1变量消去 14.4.2信念传播 14.5近似推断 14.5.1 MCMC采样 14.5.2 变分推断 14.6 话题模型 14.1 隐马尔可夫模型 概率围棋型是一类用图来表达变量相关关系的概率模型.它以图为表示工具…

Python入门级[ 基础语法 函数... ] 笔记 例题较多

本文是刚学习Python的笔记&#xff0c;当时使用的编辑器是交互式编程&#xff0c;所以很多代码可能在你们的编译器上面不能运行&#xff0c;我用快引用引起来了&#xff0c;还需要大家自己动手试一试。 内容涉及的比较简单&#xff0c;主要还是Python的语法部分&#xff1a;三…

短链接系统设计方案

背景 需要设计一个短链接系统&#xff0c;主要功能主要有如下几点&#xff1a; ToB&#xff1a; 输入一个长链接&#xff0c;转换成短链接。这个短链接有时效性&#xff0c;可以设定指定过期时间。这个系统的每天会生成千万级别的短链接。数据具备可分析功能。 ToC&#xf…

借助Vercel 十分钟搭建属于自己的AI应用站点

轻松依托 Vercel,快速构建 Nexior AI 平台 Nexior 是一个令人惊叹的开源项目&#xff0c;托管于 GitHub。通过它&#xff0c;您能够一键便捷地部署专属的 AI 应用站点&#xff0c;包括 AI 问答、Midjourney 绘画、知识库问答、艺术二维码等&#xff0c;完全不需要自己去开发 A…

springBoot+ druid配置多数据源

springBoot druid配置多数据源 1.在yml加&#xff1a; spring:#1.JDBC数据源datasource:druid:first:username: PYpassword: ral2024url: jdbc:mysql://localhost:3306/mysql?serverTimezoneUTC&characterEncodingutf8&useUnicodetrue&useSSLfalsedriver-class-n…

前端进行分页Vue3+Setup写法

当后端不方便提供数据分页查询接口时&#xff0c;就需要前端来自己分割进行分页操作 在有可能的情况下还是建议用分页查询接口&#xff0c;减少网络数据传输 首先el-table绑定数组 分页组件&#xff0c;变量自己定义防止报错 <el-paginationlayout"->, total, siz…

HTML中的<fieldset>标签元素框的使用

HTML 提供的 <fieldset> 标签用于在表单中分组相关元素。 <fieldset> 标签会在相关元素周围绘制一个框。 <legend> 标签为 fieldset 元素定义标题。 语法如下&#xff1a; <fieldset><legend>标题</legend><!-- 元素内容... -->…

qt-17不规则窗体

不规则窗体 知识点shape.hshape.cppmain.cpp运行图 知识点 感觉这个就是在图片背景 贴了白色 shape.h #ifndef SHAPE_H #define SHAPE_H#include <QWidget>class Shape : public QWidget {Q_OBJECTpublic:Shape(QWidget *parent nullptr);~Shape(); protected:void m…

最新图像修复论文汇总(2024年以来)(三)

汇总了自2024年以来新提出的高质量图像修复工作&#xff0c;包含扩散模型、transformer、mamba、sam等最前沿的技术&#xff0c;其中一些是ICLR、ICML、CVPR、ECCV、ACM MM 2024年的新作。 这里是第三部分&#xff0c;还有两部分请参阅。 最新图像修复论文汇总&#xff08;20…

【Python快速入门和实践013】Python常用脚本-目标检测之按照类别数量划分数据集

一、功能介绍 这段代码实现了从给定的图像和标签文件夹中分割数据集为训练集、验证集和测试集的功能。以下是代码功能的总结&#xff1a; 创建目标文件夹结构&#xff1a; 在指定的根目录&#xff08;dataset_root&#xff09;下创建images和labels两个文件夹。在这两个文件夹下…

瑞友科技项目经理认证负责人杨文娟受邀为第四届中国项目经理大会演讲嘉宾︱PMO评论

全国项目经理专业人士年度盛会 北京瑞友科技股份有限公司项目经理认证负责人杨文娟女士受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾&#xff0c;演讲议题为“瑞友科技项目经理人才培养体系落地实践”。大会将于10月26-27日在北京举…

【C++】C++11新增特性

目录 C11简介&#xff1a; 1、统一的列表初始化&#xff1a; std::initializer_list 2、自动类型推导&#xff1a; auto&#xff1a; decltype&#xff1a; 3、final 和 override final&#xff1a; override&#xff1a; 4、默认成员函数控制&#xff1a; 显示缺省…

第132天:内网安全-横向移动Exchange服务有账户CVE漏洞无账户口令爆破

域控环境0day.org 通过网盘分享的文件&#xff1a;131-0day.org内网域环境镜像文件 链接: https://pan.baidu.com/s/1rf_gHVJSNG8PEsiSr7DFSw?pwdr5jc 提取码: r5jc 给win7设置一张nat网卡&#xff0c;其他各个主机都设置为vm2 案例一&#xff1a; 域横向移动-内网服务-Exchan…

如何快速将地址解析为经纬度坐标?

GIS数据转换器的"地址转坐标"功能&#xff0c;可以帮助用户将地址文本快速转换为对应的经纬度坐标&#xff0c;广泛应用于地图定位、数据分析、GIS项目、在线导航、城市规划、紧急服务以及科学研究等多个领域&#xff0c;极大地提高了地理信息处理的效率和准确性。下…

【题解】—— LeetCode一周小结32

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 【题解】—— 每日一道题目栏 上接&#xff1a;【题解】—— LeetCode一周小结31 5.不含连续1的非负整数 题目链接&#xff1a;600. 不含连续…