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 }

代码中有几处需要说明:

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

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

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

猜你喜欢

转载自www.cnblogs.com/Hello-Nolan/p/12312903.html