C++静态数组的用法

news2024/11/13 14:47:16

每日诗词:

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

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


目录

数组的基础操作:

数组元素的增加:

演示:

数组元素的删除:

 演示:

数组元素的访问和修改:

演示:

数组元素的查找

代码演示: 

下期预告: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 6

    return 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 10

    return 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};

    // 打印删除前的vector
    for (int num : vec) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    // 删除最后一个元素
    vec.pop_back();

    // 打印删除后的vector
    for (int num : vec) {
        std::cout << num << " ";
    }
    // 输出:1 2 3 4

    return 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 5

    return 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.coloradmin.cn/o/2055850.html

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

相关文章

【音视频 | YUV格式】深入理解 YUV 数据格式,一文弄懂

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

【数据结构与算法】快速排序

快速排序目录 一.快速排序的原理二.快速排序的图解三.快速排序的实现1.基准两边分2.分而治之 四.完整代码 一.快速排序的原理 每次选取第一个数为基准数.然后使用乾坤大挪移将大于或者小于基准的元素分别放置于基准数两边.继续分别对基准数两侧未排序的数据使用分治法进行处理…

计算机网络之IPv4深度解析

一.IP地址 IP地址的组成方式&#xff1a;网络号 主机号 可以这样理解&#xff0c;根据网络号找路由器&#xff0c;根据主机号找连着路由器的主机 早期分类的IP地址 表示如下&#xff1a; 其中&#xff0c;有些特殊的IP地址&#xff1a; 主机号全为0&#xff0c;表示本网…

CDD数据库文件制作(十一)——服务配置(0x19_DTC Code)

文章目录 1.新建DTC2.将DTC库中的DTC加载到Variant中3.19服务设置4.一些参数设置5.会话切换配置/安全等级配置6.寻址方式/禁止肯定响应位(SPRMIB)7.DTC Code 以文件形式进行导入导出1.新建DTC 先看一下诊断调查表中定义 如何创建一个新的DTC code? 选择DTC数据库点击新建DT…

Havoc C2 上线Windows 11

1、环境配置 Windows11 更新到最新补丁(文章编写时间&#xff1a;‎2023‎年‎8‎月‎)&#xff0c;安全软件打开 Kali更新&#xff1a; apt update -y && apt upgrade -y安装设置Havoc //下载项目 cd /opt && git clone https://github.com/HavocFramework…

百度 测试|测试开发 面试真题|面经 汇总

百度测开 开发测试工程师 提前批一二三面面经 事业群&#xff1a;MEG base&#xff1a;北京 一面&#xff1a;2022.8.12 时长&#xff1a;50min 自我介绍 个人项目&#xff0c;我的项目是围绕着学校课程的项目来的&#xff0c;面试官就让我介绍这门课讲了些什么 &#xf…

【vue】编辑器段落对应材料同步滚动交互

场景需求 编辑器段落对应显示材料编辑器滚动时&#xff0c;材料同步滚动编辑器段落无数据时&#xff0c;材料不显示 实现方法 编辑器与材料组件左右布局获取编辑器高度&#xff0c;材料高度与编辑器高度一致禁用材料组件的滚动事件获取编辑器段落距离顶部的位置&#xff0c;…

鸿蒙开发5.0【基于自定义注解和代码生成实现路由框架】

场景描述 在应用开发中无论是出于工程组织效率还是开发体验的考虑&#xff0c;开发者都需要对项目进行模块间解耦&#xff0c;此时需要构建一套用于模块间组件跳转、数据通信的路由框架。 业界常见的实现方式是在编译期生成路由表。 1. 实现原理及流程 在编译期通过扫描并解…

吴恩达机器学习-C2W3-应用机器学习的建议

在本实验中&#xff0c;您将探索评估和改进机器学习模型的技术。 1-调包 首先&#xff0c;让我们运行下面的单元格来导入在此任务中需要的所有包。 numpymatplotlibscikitlearntensorflow import numpy as np %matplotlib widget import matplotlib.pyplot as plt from skle…

模拟实现queue适配器【队列】【C++】

P. S.&#xff1a;以下代码均在VS2022环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;LiUEEEEE                        …

私域经济的挖掘:多元渠道下的流量引爆方法

近年来&#xff0c;私域经济越来越受到品牌企业的青睐。基于个性化需求的私域市场&#xff0c;既有精准定位的成本优势&#xff0c;又有巨大的潜力空间。然而&#xff0c;想要把私域做成&#xff0c;其实也是充满了挑战&#xff0c;其中&#xff0c;怎样有效吸引流量&#xff0…

01、Redis入门:数据类型、基本操作、SpringDataRedis

Redis快速入门 Redis的常见命令和客户端使用 1.初识Redis Redis是一种键值型的NoSql数据库&#xff0c;这里有两个关键字&#xff1a; 键值型 NoSql 其中键值型&#xff0c;是指Redis中存储的数据都是以key、value对的形式存储&#xff0c;而value的形式多种多样&#xf…

错误信息“缺少msvcr120.dll”或“找不到msvcr120.dll”应该如何修复?几种方法快速修复

由于这个msvcr120.dll文件与应用程序的运行密切相关&#xff0c;任何与之相关的问题都可能导致应用程序无法正常运行。错误信息如“缺少msvcr120.dll”或“找不到msvcr120.dll”&#xff0c;通常出现在软件安装不正确或系统更新后。接下俩就教大家几种方法快速修复msvcr120.dll…

7 周岁自闭症儿童可以去普校上学吗?

对于许多自闭症儿童的家长来说&#xff0c;孩子能否去普通学校上学是一个至关重要的问题。而星贝育园给出了充满希望的答案。 星贝育园向家长郑重承诺&#xff0c;4 周岁之前开始干预可以 100%摘帽&#xff0c;即消除自闭症症状。在这里&#xff0c;为自闭症儿童提供个性化教学…

Spring源码解析(34)之Spring事务回滚流程

一、前言 在上一个篇章我们主要介绍了Spring事务的运行流程&#xff0c;也带着一步步debug看了整个事务的运行流程&#xff0c;但是还是欠缺了Spring事务的回滚的流程。 在上篇也主要介绍了Spring事务的传播特性&#xff0c;这里还是要看一下Spring事务的传播特性&#xff0c;因…

思博伦测试每秒最大新建、并发、吞吐

详细方法查看本文资源链接 一、最大新建测试说明 1、新建测试的主要目标是测试被测设备&#xff08;DUT&#xff09;的处理器能力。在单位时间内能够建立的连接数越多&#xff0c;说明被测设备的处理器的能力越强。 2、由于在测试过程中&#xff0c;我们只关心成功的建立TCP…

流动会场:定义新一代灵活空间的全新选择—轻空间

在当今快节奏的世界里&#xff0c;活动和会议的需求正变得越来越多样化和复杂化。无论是公司年会、大型宴会、还是各类演出和会议&#xff0c;场地的选择不仅需要满足功能需求&#xff0c;更要灵活、易于部署。正是在这样的背景下&#xff0c;“流动会场”这一创新概念应运而生…

反向沙箱是什么?如何使用反向沙箱保障上网安全

反向沙箱是什么&#xff1f; 反向沙箱是深信达的一种沙箱技术&#xff0c;又称SPN&#xff08;Sandbox Proxy Network&#xff09;沙箱。主要用于解决企业在安全上网过程中的风险问题。它通过在企业内部部署一个隔离的沙盒环境&#xff0c;实现安全的互联网访问&#xff0c;从而…

注意力机制(课程笔记)

一&#xff1a; 针对的问题 解决在循环卷积网络RNN模型中存在的信息瓶颈问题。 信息瓶颈&#xff1a; 举的是机器翻译的例子。在RNN中&#xff0c;Decoder的第一个输出取决于Encoder中的上一个输出&#xff0c;然后Decoder的其余输出都取决于上一个Decoder输出&#xff08;也就…

使用Nexus3为containerd和docker配置镜像代理

1.Nexus3介绍&#xff1a; Nexus3&#xff08;Nexus Repository Manager3&#xff09;是一个用于存储、组织和管理软件组件&#xff08;如 JAR文件、npm包、Docker镜像等&#xff09;的仓库管理系统。它由Sonatype开发并维护。Nexus Repository Manger支持许多流行的包管理工具…