将二维数组元素复制到另一个具有其他大小的二维数组中
Copy two dimensional array elements to another two dimensional array with another size
我试图将二维数组复制到另一个大小不同的数组中。例如:具有4行4列的第一个阵列:
1 2 3 4
5 6 7 8
9 0 1 2
3 4 5 6
2行8列的第二个阵列:
1 2 3 4 5 6 7 8
9 0 1 2 3 4 5 6
如果新数组中的元素比第一个元素多,则函数将用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
}
}
哦,多么好的编程难题啊。我的解决方案是将两个数组都展平并复制。
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));
为什么不从输入矩阵中创建一个临时线性数组,然后用它来填充输出矩阵:
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;
}
}
}
}
您可以使用简单的临时容器:
#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();
}
}
2D数组是而不是指针对指针是一样的!作为一个2D数组,只需一行接一行地存储行,您只需复制元素:
#include <iostream>
void trans(int* orig, int rows1, int cols1, int *resul, int rows2, int cols2) {
int tot1 = rows1 * cols1;
int tot2 = rows2 * cols2;
int tot = tot1;
if (tot2 < tot) tot = tot2;
// copy the smallest size from both arrays
for(int i=0; i<tot; i++) {
resul[i] = orig[i];
}
// eventually add 0 to fill resul array
for(int i=tot; i<tot2; i++) {
resul[i] = 0;
}
}
int main()
{
int orig[4][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6};
// control initial array
for (int i=0; i<4; i++) {
for (int j=0; j<4; j++) {
std::cout << orig[i][j];
}
std::cout << std::endl;
}
int resul[2][8];
// pass arrays as 1D array pointers!
trans(reinterpret_cast<int *>(&orig), 4, 4, reinterpret_cast<int *>(&resul), 2, 8);
// control converted array
for (int i=0; i<2; i++) {
for (int j=0; j<8; j++) {
std::cout << resul[i][j];
}
std::cout << std::endl;
}
return 0;
}
如预期:
1234
5678
9012
3456
12345678
90123456
如您所知,C/C++n维数组在内存上具有线性表示。因此,如果你将打开这种表示,你会得到以下好处:
std::vector<int> v1{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
for(size_t r = 0; r < 4; r++)
for(size_t c = 0; c < 4; c++)
std::cout << v1[r*4+c];
std::vector<int> v2(v1);
for(size_t r = 0; r < 2; r++)
for(size_t c = 0; c < 8; c++)
std::cout << v2[r*8+c];
这里有一个非常简单的方法:
void
changearr(
int **in,int in_size1,int in_size2,
int **out,int out_size1,int out_size2
)
{
int in_n = in_size1*in_size2;
int out_n = out_size1*out_size2;
int n = min(in_n,out_n);
int i = 0;
for (; i!=n; ++i) {
out[i/out_size2][i%out_size2] = in[i/in_size2][i%in_size2];
}
for (; i!=out_n; ++i) {
out[i/out_size2][i%out_size2] = 0;
}
}
这个想法只是线性地迭代索引,并根据需要计算输入和输出数组的对应索引。
相关文章:
- 将值从二维数组输出到文本文件
- 在二维数组中查找最小值和最大值?
- 移动二维数组中的字符
- 如何正确填充在堆上分配的二维数组?
- 传递二维数组时出现问题
- 具有随机数的二维数组不会更改
- 如何在C++中获取二维数组中最少的一列数?
- 如何使用用户输入变量制作二维数组?
- C++ 中动态二维数组的访问冲突
- 遍历二维数组的所有子数组
- 将二维数组的所有元素插入到一维数组中
- 在函数中传递二维数组
- 为什么指针在对二维数组进行排序时无法正常工作?
- 创建 std::string 的二维数组的最佳做法
- 如何将文本文件读取到二维数组中并以 c++ 打印
- 元素在二维数组 c++ 中的出现次数
- 我无法将二维数组的两个元素的差异分配给C++中其他数组的元素?
- 如何使用二维数组来计算和存储来自其他数组的值的频率
- 在C++中将一个二维数组复制到其他未知大小的二维数组
- 将二维数组元素复制到另一个具有其他大小的二维数组中