我正在尝试通过使用温度数组来切换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个第一个记录。