14. 数组扩容函数

题目:

编写一个模板函数 change_length_1d,它将一个一维数组的长度从 old_length 变成 new_length。函数首先分配一个新的,长度为 new_length 的数组,然后把原数组的前 min { old_length , new_length } 个元素复制到新数组中,然后释放原数组所占用的空间。测试你的代码。

思路:

要注意到,新长度与旧长度不一样,当新长度更长时,进行扩容,反之就是缩短了数组。扩容时复制全部元素,缩短时只复制前 n 个元素,将剩余元素丢弃。可以发现,不论是扩容还是缩小,始终按照两者中最小的大小进行复制即可。

代码:

 1 #include <iostream>
 2 using namespace std;
 3
 4 template <typename T>
 5 void change_length_1d (T* &x, T*& new_x, int old_length, int new_length) {
 6     int size = 0;
 7     if (old_length <= new_length) {
 8         size = old_length;
 9     } else {
10         size = new_length;
11     }
12
13     new_x = new T [new_length];
14     for (int i = 0; i < size; ++i) {
15         new_x[i] = x[i];
16     }
17
18     delete [] x;
19 }
20
21 int main() {
22     int* old_array = new int [5] { 0, 1, 2, 3, 4 };
23
24     int* new_array_smaller;
25     int* new_array_bigger;
26
27     change_length_1d(old_array, new_array_bigger, 5, 6);
28     for (int i = 0; i < 6; ++i) {
29         cout << new_array_bigger[i] << " ";
30     }
31     cout << endl;
32
33     change_length_1d(new_array_bigger, new_array_smaller,6, 2);
34     for (int i = 0; i < 2; ++i) {
35         cout << new_array_smaller[i] << " ";
36     }
37
38     return 0;
39 }

代码中有几处需要说明:

第一,传入的两个数组均需要改动,因此要传引用。

第二,在数组大小等常量中,我使用了硬编码的方式,只是为了测试方便,这种写法并不规范。

第三,需要注意,当新数组长度大小大于旧数组时,将旧数组元素完全复制了过来,但是新数组后半部分没有值,需要进行初始化,保证里面不会出现垃圾值,我这里并没有进行处理。

原文地址:https://www.cnblogs.com/Hello-Nolan/p/12312903.html

时间: 2024-10-09 23:11:52

14. 数组扩容函数的相关文章

C语言 指针基础篇 数组,函数与指针的运用 2 14

下面看看如何在函数中运用指针吧 下面是往函数传入指针的简单操作,不是传入数组的.判断一个a是否大于b是的话给,是的话对其进行操作,不是的话就直接返回. 1 #include <stdio.h> 2 int main(){ 3 int num1,num2,*p1,*p2; 4 p1 = &num1,p2=&num2; 5 scanf("%d%d",&num1,&num2); 6 7 int fun(int *n1,int *n2); //我们在

JavaScript中常见的数组操作函数及用法

昨天写了个帖子,汇总了下常见的JavaScript中的字符串操作函数及用法.今天正好有时间,也去把JavaScript中常见的数组操作函数及用法总结一下,这样方便大家准备参考.如果恰好你也在准备各种笔试,希望对你有所帮助.同时,也欢迎补充. 1.数组创建 创建数组应该是最简单的了,有用数组字面量创建和数组构造函数两种方法,见下: var array1 = new Array(); var array2 = []; 上面是创建数组的最常见的两种方法,其中第二种方法因为简单直观而被开发者推崇.其中,

C语言二维数组作为函数的参数

前言:今天在实现装配线调度程序时候,用到了二维数组,并将其作为函数的参数.在写程序的时候,遇到一些问题,即二维数组做函数的参数应该如何正确表示.我写程序的错误如下程序所示: #include <cstdio> void print(int *a[3]) { printf("%d\n",a[0][0]); } int main() { int a[2][3] = {1,2,3,4,5,6}; print(a); return 0; } 编译程序时候,在第10行提示错误信息:|

C语言数组和函数实例练习

C语言的数组和函数部分的知识,在语法上和Java语法是有所相似的,这里只通过实例总结一些自己感觉需要理解的部分知识. 1.数组 数组中的元素具有相同的数据类型:数组一旦创建,不能被改变:数组中元素在内存中是连续依次存在的:使用时需要随时注意下标越界的问题. 例1:输入数量不确定的[0,9]范围内的整数,统计每个数字出现的次数,输入-1时结束程序. #include <stdio.h> #include <stdlib.h> int main() { int i; int num[1

二维数组作为函数参数深度详解

        前几天和同学讨论数组作为函数参数,感觉各种困惑.花了一些时间在网上查看了一些资料,并加上自己的理解.记录一下! 一. 指向指针的指针和指向数组的指针 很多人以为"指向数组的指针"就是"指向指针的指针",于是有人写这样的代码: int a[3][4]; int **p = a; //错误 数组实际类型是int [3][4],在作为右值时可以被转化为int (*)[4],它们都和int **不同,自然不可用. 那么,你要用一个指针来指向a,就要用一个

PHP中的数组(二)常用数组处理函数

数组的相关处理函数    一.数组键/值操作有关的函数        1.array_values()   无论是关联的还是索引的返回的都是索引数组 1 <?php 2 $lamp=array("os"=>"Linux","webserver"=>"Apache","db"=>"Mysql","language"=>"php&q

PHP数组处理函数的使用array_push(一)

使用PHP做数据处理时会涉及到大量的数组操作,这里我就记下各种数组处理函数的使用方法,好记性不如烂笔头!! 一.array_push的使用方法:将一个或多个单元压入数组的末尾(入栈) 说明:int array_push ( array &$array , mixed $var [, mixed $... ] )     参数说明:array是输入的数组    $var要压入的值 这里的 mixed 说明该参数可以接受多种不同的(但不一定是所有的)类型. array_push() 将 array

@清晰掉 传递数组给函数

一维数组 传递数组给函数的3个原则 1.函数调用时只需传递数组名. 2.在函数定义中,形参的类型必须与数组的相同,数组的大小不必指定. 3.函数原型必须定义为参数是一个数组. 1 #include <stdio.h> 2 #include <stdlib.h> 3 void sort(int x[], int m); 4 int main() 5 { 6     int i; 7     int marks[5] = {40, 90, 73, 81, 35}; 8       9

[C++程序设计]用数组名作函数参数

1. 用数组元素作函数实参 1 #include <iostream> 2 using namespace std; 3 4 int max_value(int x, int max) 5 { 6 return max > x ? max : x; 7 } 8 9 int main() 10 { 11 const int x = 3, y = 4; 12 int a[x][y]={{34,62,34,101},{45,67,3,0},{11,45,97,100}}; 13 int max