我试图将二维数组复制到另一个大小的另一个数组.例如:第一个包含4行和4列的数组:
1 2 3 4
5 6 7 8
9 0 1 2
3 4 5 6
Run Code Online (Sandbox Code Playgroud)
第二个数组有2行和8列:
1 2 3 4 5 6 7 8
9 0 1 2 3 4 5 6
Run Code Online (Sandbox Code Playgroud)
如果新数组中的元素多于第一个元素,则函数将用0填充它
这是我做的功能,但索引的问题.如何以正确的方式写出来?
void changearr(int **ppm, int size1, int size2, int size_1, int size_2)
{
int **temp = new int*[size_1];
for (int i = 0; i < size_1; i++)
temp[i] = new int[size_2];
int z = 0;
for (int i = 0; i < size_1; i++, z++)
{
for (int j = 0, k = 0; j < size_2; j++, k++)
{
if (i < size_1 || j < size_2)
{
temp[i][j] = ppm[z][k];
}
else
temp[i][j] = 0
}
}
Run Code Online (Sandbox Code Playgroud)
哦,这是一个很棒的编程难题.我的解决方案是将两个数组展平并复制它们.
template <typename T>
static constexpr T* begin(T& value) noexcept
{
return &value;
}
template <typename T, ::std::size_t N>
static constexpr typename ::std::remove_all_extents<T>::type*
begin(T (&array)[N]) noexcept
{
return begin(*array);
}
template <typename T>
static constexpr T* end(T& value) noexcept
{
return &value + 1;
}
template <typename T, ::std::size_t N>
static constexpr typename ::std::remove_all_extents<T>::type*
end(T (&array)[N]) noexcept
{
return end(array[N - 1]);
}
int a[4][4];
int b[2][8];
::std::copy(begin(a), end(a), begin(b));
Run Code Online (Sandbox Code Playgroud)
为什么不从输入矩阵创建一个临时线性数组,然后使用它来填充输出矩阵:
void changearr ( int** ppm, int old_row, int old_col, int new_row, int new_col )
{
int* temp_linear = new int[old_row * old_col];
int k = 0;
for ( int i = 0; i < old_row; i++ )
{
for ( int j = 0; j < old_col; j++ )
{
temp_linear[k++] = ppm[i][j];
}
}
int** temp = new int* [new_row];
for ( int i = 0; i < new_row; i++ )
{
temp[i] = new int[new_col];
}
k = 0;
for ( int i = 0; i < new_row; i++ )
{
for ( int j = 0; j < new_col; j++ )
{
if ( k < old_row * old_col )
{
temp[i][j] = temp_linear[k++];
}
else
{
temp[i][j] = 0;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
你可以使用简单的临时容器:
#include <iostream>
#include <deque>
#include <array>
int main()
{
std::array<std::array<int,4>,4> first {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; //4x4
std::array<std::array<int,8>,2> second; //2x8
std::deque<int> temp; //temporary container
for(auto x : first)
for(auto y : x)
temp.push_back(y); //push everything from first to deque
for(auto& x : second)
for(auto& y : x)
{
y = temp.front(); //move from deque to second and pop()
temp.pop_front();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4426 次 |
| 最近记录: |