题目:
编写一个模板函数 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