• 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 }

    代码中有几处需要说明:

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

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

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

  • 相关阅读:
    [转]java抽象类和接口和继承之间关系
    HTML accesskey 属性
    [转]OGNL使用小结
    [转] iBATIS框架理论学习篇
    Python Pyramid with MySQL
    Python Pyramid with PostgreSQL
    PostgreSQL 安装
    wpa_supplicant on linux
    postgresql 常用命令 {转载}
    Arduino 各种模块篇 [留个小任务,现在去学习python 网络编程]
  • 原文地址:https://www.cnblogs.com/Hello-Nolan/p/12312903.html
Copyright © 2020-2023  润新知