了解2D阵列的副本



我正在尝试通过使用温度数组来切换2D数组的col和行,并使用std :: coppy在末尾用temp替换原始数组。但是STD ::复制仅复制第一行,而REST在原始数组中显示相同的旧值。语句array = {};不是清除索引为0。

// Clear array to 0 (issue: This has no effect at all)    
array[arrayRowSize][arrayColSize] = {};
// Copy array (issue: only first row is copied, rest of original still has old values)
std::copy(&tempArray[0][0], (&tempArray[0][0])+arrayColSize*arrayRowSize, &array[0][0]);

谁能看我的代码,告诉我我做错了什么?请添加一些有关其实际工作方式的详细信息,并建议我们是否有任何改进。

#include <iostream>
#include <cstdint>
using namespace std;
bool IsIntegerInputValid (int16_t arrayData, int8_t arrayLimit)
{
    // Entered input is a non-digit, negative number or > arrayLimit ?
    if ( cin.fail() || arrayData < 0 || arrayData > arrayLimit )
    {
        // Clear error flag and input buffer
        cin.clear();
        cin.ignore();
        cout << "Invalid input, Please try again" << endl;
        return false;
    }
    return true;
}
int main()
{
    const uint8_t kMaxArraySize = 10;
    int16_t array[kMaxArraySize][kMaxArraySize] = {};
    int16_t arrayRowSize = 0;
    int16_t arrayColSize = 0;
    // Get array size
    while (1)
    {
        cin >> arrayRowSize;
        if ( IsIntegerInputValid ( arrayRowSize, kMaxArraySize) )
        {
            while (1)
            {
                cin >> arrayColSize;
                if ( IsIntegerInputValid ( arrayColSize, kMaxArraySize) )
                {
                    break; // Got valid size
                }
            }
            break; // Got valid size
        }
    }
    // Get array input
    for (int i = 0; i < arrayRowSize; ++i)
    {
        for (int j = 0; j < arrayColSize; ++j)
        {
            cin >> array[i][j];
            if ( !IsIntegerInputValid (array[i][j], kMaxArraySize) )
            {
                --i; // Try again
            }
        }
    }
    // Copy rows to cols and cols to rows
    int16_t tempArray[kMaxArraySize][kMaxArraySize] = {};
    for (int i = 0; i < arrayColSize; ++i)
    {
        for (int j = 0; j < arrayRowSize; ++j)
        {
            tempArray[i][j] = array[j][i];
            cout << tempArray[i][j] << ' ';
        }
        cout << endl;
    }
    array[arrayRowSize][arrayColSize] = {}; // Clear array to 0 (issue: This has no effect at all)
    // Copy array (issue: only first row is copied, rest of original still has old values)
    std::copy(&tempArray[0][0], (&tempArray[0][0])+arrayColSize*arrayRowSize, &array[0][0]);
    return 0;
}

谢谢

array[arrayRowSize][arrayColSize] = {}; // Clear array to 0 (issue: This has no effect at all)

这将访问下一个array的边界行的表元素,并在该行的下一个列列(如果行具有任何不含边界的列)。行为不确定。可以访问的最后一个索引是array[arrayRowSize - 1][arrayColSize - 1]。分配给元素的元素无能为力,无需清除数组的行。

要将数组的所有元素设置为零,我将使用:

std::memset(array, 0, sizeof array);

也就是说,您将要覆盖所有值,所以这似乎是毫无意义的。


std::copy(&tempArray[0][0], (&tempArray[0][0])+arrayColSize*arrayRowSize, &array[0][0]);

这假定线路连续存储在内存中。如果那是真的,那就可以了。但是,由于您已经分配了一个大数组,并且仅使用每行的一部分,因此各个行的未使用部分。

一个示例:您分配一个7x7数组,然后在其中只使用3x3数组。内存布局可能以下内容:

|-----| <- a row
AAAXXXXBBBXXXXCCCX...
|-------| <- first 9 elements
A represents first row, B represents second ...
X represents unused part of the array.

现在,如果您复制9个连续元素,就好像它们都是数组中的所有元素一样,您将获得AAAXXXXBB,其中包含大量未使用的Elemnets,而不是所有已使用的元素。

由于您的行不连续,因此您必须分别复制每一行。或者,您可以复制包括未使用部分的整个数组。

副本不起作用,因为您的aray尺寸与kmaxarraysize不同。

复制试图将数组复制为一维数组。但是在您的情况下,覆盖到1D的2D阵列内部可能有很多零。如果您选择了尺寸3,3您的数组将是:

1 2 3 0 0 0 0 0 0 0
4 5 6 0 0 0 0 0 0 0
7 8 9 0 0 0 0 0 0 0
......

对于1D表示形式,它看起来像:

1 2 3 0 0 0 0 0 0 0 4 5 6 0 0 0 0 0 0 0 7 8 9 0 0 0 0 0 0

,但复制只会记录9个第一个记录。

最新更新