C++ 按列复制C/C++;排列

C++ 按列复制C/C++;排列,c++,c,multidimensional-array,C++,C,Multidimensional Array,我有各种文本文件被存储。我可以按我的意愿把这些读入并保存下来。但是,在某些情况下,我希望放弃矩阵的列。我可以通过嵌套循环来实现这一点,但我认为应该有一种方法可以通过memcpy或类似的东西来实现。以下是一个例子: #include <string.h> using namespace std; int main(){ int a1[4][3]; int count(0); for (int i = 0; i < 4; ++i){ for (int j = 0;

我有各种文本文件被存储。我可以按我的意愿把这些读入并保存下来。但是,在某些情况下,我希望放弃矩阵的列。我可以通过嵌套循环来实现这一点,但我认为应该有一种方法可以通过
memcpy
或类似的东西来实现。以下是一个例子:

#include <string.h>

using namespace std;

int main(){

int a1[4][3];

int count(0);

for (int i = 0; i < 4; ++i){
    for (int j = 0; j < 3; ++j){
        a1[i][j] = count;
        ++count;
    }
}

int a2[4][2];

memcpy(a2, a1, sizeof(int) * 8);

int a3[4][2];
int *t = &a1[0][1];
memcpy(a3, t, sizeof(int) * 8);

return 0;
}
相反。这是
a1
的前两列。如果我定义
aTransposed[3][4]
并将其用作:

int aTransposed[3][4];
for (int i = 0; i < 3; ++i){
    for(int j = 0; j < 4; ++j){
        aTransposed[i][j] = a1[j][i];
    }
}
memcpy(a2, aTransposed, sizeof(int) * 8);
int-aTransposed[3][4];
对于(int i=0;i<3;++i){
对于(int j=0;j<4;++j){
aTransposed[i][j]=a1[j][i];
}
}
memcpy(a2,非透明,尺寸(内部)*8);
a2
将包含正确的值,但位置错误

我的问题是如何在不使用循环的情况下将任何给定列从一个数组复制到另一个数组中?C或C++溶液都很好。尽量避免使用额外的库,如Eigen或Boost

编辑
对于那些围绕C/C++标记的人。这里面没有任何东西必须是C或C++。任何一种方法都会奏效。是的,我写的片段是C++的,但也可以很容易地完成。我试图在两种语言中找到解决方案。因此,这两个标记都被使用。

对象的内存布局声明为:

int a1[4][3];
int a2[4][2];


对象的内存布局声明为:

int a1[4][3];
int a2[4][2];

定义
a1
第三列的元素包括:

+---+---+---+---+---+---+---+---+---+---+---+---+
|         x |         x |         x |         x |
+---+---+---+---+---+---+---+---+---+---+---+---+
+---+---+---+---+---+---+---+---+
|     x |     x |     x |     x |
+---+---+---+---+---+---+---+---+
定义
a2
第二列的元素包括:

+---+---+---+---+---+---+---+---+---+---+---+---+
|         x |         x |         x |         x |
+---+---+---+---+---+---+---+---+---+---+---+---+
+---+---+---+---+---+---+---+---+
|     x |     x |     x |     x |
+---+---+---+---+---+---+---+---+
由于定义列的元素不在连续内存中,因此
无法使用
memcpy
将列从
a1
复制到
a2
。使用循环是将一个列从<代码> A1 < /代码>复制到<代码> A2< /COD> .< /P> C或C++,选择一个。@ CykkRAMER,这将不会编译在C.@ RabBID76中,这很有趣。我想知道如何从0以外的列开始,所以我尝试了这个
int*t=&a1[I][var1];memcpy(a2[i],t,sizeof(int)*var2)我可以根据需要更改
var1
var2
。无论编辑如何,如果OP只需要一个算法,这应该是语言无关的,或者应该选择他们想要的语言,而不是给出任意选择的语言答案。如果说它应该是Java或Fortran语言,那么它也同样有意义,因为没有C/C++标记。但是,如果您提供指向该语言C/C++规范的链接,我们很乐意添加一个。直到那时,仍然有两种不同的语言C和C++。你还是应该选一个。否则,这个问题应该被认为过于宽泛。在C++中使用C编程风格,反之亦然,就是糟糕的编码。