14. 数组扩容函数

Posted hello-nolan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

代码中有几处需要说明:

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

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

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

以上是关于14. 数组扩容函数的主要内容,如果未能解决你的问题,请参考以下文章

web代码片段

几个关于js数组方法reduce的经典片段

js简洁代码片段

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装