如何使用动态分配增加数组中的单元格数?

时间:2015-05-29 11:21:58

标签: c++ arrays

所以我尝试使用动态分配来增加数组中的单元格数。

数组来自我创建的包含x和y协调的类型位置

过程就是这样:

  1. 我创建了一个大小相同的新HEAP位置数组+ 1
  2. 我使用for循环将所有以前的位置复制到新数组
  3. 删除上一个指针
  4. 将前一个指向新的
  5. 我做错了什么?

    这是代码:

    void ExtendLocArray(location** ilocPrevArray, int inNumberOfMovements)
    {
        // Variable definition
        location* locNewPathArray = new location[inNumberOfMovements];
        int       nIndex;
    
        // Code section
    
        // Copies the previous locations
        for (nIndex = inNumberOfMovements - 2; nIndex >= 0; nIndex--)
        {
            locNewPathArray[nIndex] = (*ilocPrevArray)[nIndex];
        }
    
        delete[](*ilocPrevArray);
    
        (*ilocPrevArray) = locNewPathArray;
    }
    

1 个答案:

答案 0 :(得分:0)

正确的函数可以按以下方式查找(假设您要以相反的顺序复制数组的元素)

void ExtendLocArray( location** ilocPrevArray, size_t inNumberOfMovements )
{
    // Variable definition
    location* locNewPathArray = new location[inNumberOfMovements];

    // Copies the previous locations
    for ( size_t i = inNumberOfMovements - 1; i != 0; i-- )
    {
        locNewPathArray[i-1] = ( *ilocPrevArray )[i-1];
    }

    delete [] *ilocPrevArray;

    *ilocPrevArray = locNewPathArray;
}

您可以声明类似

的功能
void ExtendLocArray( location * &ilocPrevArray, size_t inNumberOfMovements );

你可以使用对指针的引用。

这是一个演示程序,我使用typedef作为程序可以编译的名称位置。

#include <iostream>

// simplified definition of location
typedef int location;

void ExtendLocArray( location** ilocPrevArray, size_t inNumberOfMovements )
{
    // Variable definition
    location* locNewPathArray = new location[inNumberOfMovements];

    // Copies the previous locations
    for ( size_t i = inNumberOfMovements - 1; i != 0; i-- )
    {
        locNewPathArray[i-1] = ( *ilocPrevArray )[i-1];
    }

    delete [] *ilocPrevArray;

    *ilocPrevArray = locNewPathArray;
}

int main() 
{
    const size_t N = 10;
    location *p = nullptr;

    for ( size_t i = 0; i < N; i++ )
    {
        ExtendLocArray( &p, i + 1 );
        p[i] = i;
    }

    for ( size_t i = 0; i < N; i++ ) std::cout << p[i] << ' ';
    std::cout << std::endl;

    delete [] p;

    return 0;
}

程序输出

0 1 2 3 4 5 6 7 8 9

考虑到您自己可以使用标头std::copy_backward中声明的标准算法<algorithm>,而不是自己编写循环。例如

#include <algorithm>

//...
std::copy_backward( *ilocPrevArray, 
                    *ilocPrevArray + inNumberOfMovements - 1, 
                    locNewPathArray + inNumberOfMovements - 1 );