资讯动态

C++信奥静态数组和动态数组

发布时间:2026/8/6 19:03:52 来源:尧图企业网站定制
在 C 中数组是存储固定大小同类型元素的集合。数组的定义、输入输出、应用注意事项以及去重方法。一维数组的静态与动态定义静态定义栈内存这是最常见的方式。数组的大小在编译时确定存储在栈区。语法类型 数组名[大小];示例inta[10];// 定义一个包含10个整数的数组未初始化值随机intb[5]{1,2,3,4,5};// 定义并初始化intc[]{10,20};// 省略大小编译器自动推断为2特点速度快但大小受限通常几 MB函数结束后自动销毁。动态定义堆内存当数组大小需要在运行时才能确定或者需要非常大的空间时使用。方式一使用newintn;cinn;int*arrnewint[n];// 在堆上分配 n 个 int 的空间// ... 使用数组 ...delete[]arr;// 【重要】必须手动释放内存防止内存泄漏方式二使用vector推荐C STL 提供的动态数组自动管理内存。#includevectorintn;cinn;vectorintvec(n);// 定义大小为 n 的动态数组// 不需要手动 delete输入与输出C 原生不支持直接cin a或cout a来操作整个数组必须使用循环逐个处理。输入inta[5];// 方法for 循环for(inti0;i5;i){cina[i];}输出// 方法for 循环for(inti0;i5;i){couta[i] ;}coutendl;// C11 范围 for 循环更简洁for(intx:a){coutx ;}数组的应用及注意事项常见应用批量数据处理如计算平均分、查找最大值/最小值。桶排序/计数利用下标记录数据出现的次数例如统计字符频率。模拟数据结构用数组模拟栈、队列或哈希表。核心注意事项避坑指南下标越界数组下标从0开始到N-1结束。访问a[N]是严重错误可能导致程序崩溃或读取脏数据。未初始化局部数组在函数内定义的如果不初始化里面的值是随机的垃圾值。全局数组默认初始化为 0。大小限制不要在函数内部定义过大的静态数组如int a[10000000]这会导致栈溢出。大数组应定义为全局变量或使用vector。长度不可变静态数组一旦定义长度无法改变。如果需要变长请使用std::vector。数组去重的两种方法假设有一个无序数组需要去除重复元素。方法一排序 双指针原地去重节省空间先对数组排序重复的元素会相邻然后通过双指针将不重复的元素移到前面。时间复杂度O(Nlog⁡N)O(N \log N)O(NlogN)空间复杂度O(1)O(1)O(1)#includealgorithm#includeiostreamusingnamespacestd;intmain(){inta[]{4,2,4,1,2,3};intn6;// 1. 排序sort(a,an);// 2. 双指针去重intk0;// k 指向去重后数组的最后一个位置for(inti1;in;i){if(a[i]!a[k]){a[k]a[i];// 将不重复的元素前移}}// 输出去重后的结果 (长度为 k1)for(inti0;ik;i){couta[i] ;}return0;}方法二使用set集合代码简单自动去重利用std::set不允许存储重复元素的特性。时间复杂度O(Nlog⁡N)O(N \log N)O(NlogN)空间复杂度O(N)O(N)O(N)#includeiostream#includesetusingnamespacestd;intmain(){inta[]{4,2,4,1,2,3};intn6;setints;// 插入所有元素set 会自动去重并排序for(inti0;in;i){s.insert(a[i]);}// 遍历输出for(intx:s){coutx ;}return0;}C 一维数组核心速查表1. 数组定义方式速查方式语法内存位置特点与适用场景静态定义int a[10];栈区编译时确定大小速度快但大小受限防栈溢出。动态定义(new)int* a new int[n];堆区运行时确定大小必须手动delete[]释放。动态定义(vector)vectorint a(n);堆区最推荐。自动管理内存支持动态扩容防越界。2. 输入与输出模板输入for(int i0; in; i) cin a[i];输出for(int x : a) cout x ;(范围 for 循环最简洁)3. 避坑指南注意事项下标从 0 开始有效范围是0到N-1访问a[N]会越界崩溃。局部数组需初始化函数内定义的int a[10];默认是随机垃圾值建议写int a[10] {0};。大数组放全局超过百万级别的数组一定要定义在函数外面全局区或用vector否则必栈溢出。4. 数组去重方案对比方法核心逻辑时间复杂度空间复杂度适用场景排序 双指针先sort再用双指针把不重复的元素往前挪。O(Nlog⁡N)O(N \log N)O(NlogN)O(1)O(1)O(1)要求原地修改、节省内存或算法题限制空间。Set 集合将元素丢进set自动去重并排序。O(Nlog⁡N)O(N \log N)O(NlogN)O(N)O(N)O(N)追求代码极简不在乎额外空间开销。1.为什么需要“魔法背包” ----Vector“同学们之前我们学的普通数组静态数组就像是一个固定大小的收纳盒。如果盒子里只能装 5 个苹果你非要塞进第 6 个盒子就会‘砰’地炸掉程序崩溃但是如果我们去超市买东西根本不知道会买多少件怎么办这时候我们需要一个魔法背包vector你放进去一个苹果它就变大一点放进去十个它继续变大。它会自动调整大小永远不会撑爆”2. 核心语法魔法背包的“三件套”第一步准备背包声明#includevector// 必须带上这个“说明书”vectorintmyBag;// 准备一个装整数的魔法背包第二步往背包里放东西push_backmyBag.push_back(10);// 放进一个 10myBag.push_back(20);// 再放进一个 20myBag.push_back(30);// 继续放【提示】push_back就像是往背包后面“推push”进去一个东西back就是“后面”。第三步看看背包里有什么遍历C11 范围 for 循环这比传统的for(int i0; in; i)简单太多。for(intitem:myBag){coutitem ;}3. 实战演练超级加法器用一个能无限接收数字直到输入特定数字比如 -1才停止的小程序体验vector的威力。#includeiostream#includevectorusingnamespacestd;intmain(){vectorintnumbers;// 1. 准备空背包intnum;cout请输入数字输入 -1 结束;// 2. 无限接收数据直到遇到 -1while(cinnumnum!-1){numbers.push_back(num);// 自动放进背包}// 3. 打印所有收集到的数字cout你一共输入了这些数字;for(intn:numbers){coutn ;}return0;}4.“避坑”建议忘记写头文件这是最常见的错误。可以编个口诀“用魔法背包先喊#include vector”。拼写错误push_back中间有个下划线很多孩子会写成pushback。建议让他们把push_back当作一个完整的单词来记。最好不要用new和delete千万不要在这个阶段提new int[n]和内存泄漏这会产生畏难情绪。vector就是为了替代这些复杂操作的。关于size()函数可以补充numbers.size()这是“看看背包里有几个东西”在写普通 for 循环遍历时会用到。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价