C++ 如何使用std::copy for int** My2DClass::My2DClass(常量int r,常量int c,int mat[3][3]):m_r(r),m_c(c) { 矩阵=新整数*[r]; 对于(int i=0;i

C++ 如何使用std::copy for int** My2DClass::My2DClass(常量int r,常量int c,int mat[3][3]):m_r(r),m_c(c) { 矩阵=新整数*[r]; 对于(int i=0;i,c++,C++,如何为int**使用std::copy()?注释行在运行时抛出异常。您正在为数组分配指针数组,因此对std::copy()的单个调用将不起作用。您必须对每个数组分别调用std::copy()。实际上,只有最内部的循环可以替换为std::copy(),例如: My2DClass::My2DClass(常量int r、常量int c、int mat[3][3]) :mur(r),muc(c) { 矩阵=新整数*[r]; 对于(int i=0;i

如何为
int**
使用
std::copy()
?注释行在运行时抛出异常。

您正在为数组分配指针数组,因此对
std::copy()
的单个调用将不起作用。您必须对每个数组分别调用
std::copy()
。实际上,只有最内部的循环可以替换为
std::copy()
,例如:

My2DClass::My2DClass(常量int r、常量int c、int mat[3][3])
:mur(r),muc(c)
{
矩阵=新整数*[r];
对于(int i=0;i
如果将剩下的两个循环合并为一个循环,例如:

My2DClass::My2DClass(常量int r、常量int c、int mat[3][3])
:mur(r),muc(c)
{
矩阵=新整数*[r];
对于(int i=0;i
然后您可以使用
std::for_each()
替换该循环,例如:

My2DClass::My2DClass(常量int r、常量int c、int mat[3][3])
:mur(r),muc(c)
{
矩阵=新整数*[r];
标准::对于每个(矩阵,矩阵+r,
[=](int*&arr){
arr=新整数[c];
标准::副本(&mat[i][0],&mat[i][c],arr);
//或:std::copy_n(&mat[i][0],c,arr);
}
);
}

不过,您确实应该避免使用<代码> NeX[]/COD>手动,而是考虑使用<代码> STD::vector < /COD>,这将极大地简化数组的管理(如:

)。
//std::向量矩阵;
My2DClass::My2DClass(常量int r、常量int c、int mat[3][3])
:m_r(r)、m_c(c)、矩阵(r)
{
对于(int i=0;i

否则,请将您的<代码>矩阵<代码>变为单个一维数组。尤其是因为输入

mat
在内存中是一个平面数组。然后您可以从一个到另一个执行单个
std::copy()
,例如:

//int*矩阵;
My2DClass::My2DClass(常量int r、常量int c、int mat[3][3])
:m_r(r),m_c(c),矩阵(新整数[r*c])
{
std::复制(&mat[0][0],&mat[r][c],矩阵);
}
或者,改用
std::vector

//std::向量矩阵;
My2DClass::My2DClass(常量int r、常量int c、int mat[3][3])
:m_r(r),m_c(c),矩阵(&mat[0][0],&mat[r][c])
{
}
无论哪种方式,都可以使用以下公式将二维索引转换为一维索引:

(r*m_c)+c

例如:

int&My2DClass::operator()(int r,int c)
{
返回矩阵[(r*m_c)+c];
}

您正在为数组分配一个指针数组,因此对
std::copy()
的单个调用将不起作用。您必须对每个数组分别调用
std::copy()
。实际上,只有最内部的循环可以替换为
std::copy()
,例如:

My2DClass::My2DClass(常量int r、常量int c、int mat[3][3])
:mur(r),muc(c)
{
矩阵=新整数*[r];
对于(int i=0;i
如果将剩下的两个循环合并为一个循环,例如:

My2DClass::My2DClass(常量int r、常量int c、int mat[3][3])
:mur(r),muc(c)
{
矩阵=新整数*[r];
对于(int i=0;i
然后您可以使用
std::for_each()
替换该循环,例如:

My2DClass::My2DClass(常量int r、常量int c、int mat[3][3])
:mur(r),muc(c)
{
矩阵=新整数*[r];
标准::对于每个(矩阵,矩阵+r,
[=](int*&arr){
arr=新整数[c];
标准::副本(&mat[i][0],&mat[i][c],arr);
//或:std::copy_n(&mat[i][0],c,arr);
}
);
}

不过,您确实应该避免使用<代码> NeX[]/COD>手动,而是考虑使用<代码> STD::vector < /COD>,这将极大地简化数组的管理(如:

)。
//std::向量矩阵;
My2DClass::My2DClass(常量int r、常量int c、int mat[3][3])
:m_r(r)、m_c(c)、矩阵(r)
{
对于(int i=0;i

否则,请将您的<代码>矩阵<代码>变为单个一维数组。尤其是因为输入

mat
在内存中是一个平面数组。然后您可以从一个到另一个执行单个
std::copy()
,例如:

//int*矩阵;
My2DClass::My2DClass(常量int r、常量int c、int mat[3][3])
:m_r(r),m_c(c),矩阵(新整数[r*c])
{
std::复制(&mat[0][0],&mat[r][c],矩阵);
}
或者,改用
std::vector

//std::向量矩阵;
My2DClass::My2DClass(常量int r、常量int c、int mat[3][3])
:m_r(r),m_c(c),矩阵(&mat[0][0],&mat[r][c])
{
}
无论哪种方式,都可以使用以下公式将二维索引转换为一维索引:

(r*m_c)+c

例如:

int&My2DClass::operator()(int r,int c)
{
ret
My2DClass::My2DClass(const int r, const int c, int mat[3][3]):m_r(r),m_c(c)
{
    matrix = new int*[r];
    for (int i = 0; i < r; i++)
        matrix[i] = new int[c];
    for (int i = 0; i < m_r; i++) {
        for (int j = 0; j < m_c; j++) {
            matrix[i][j] = mat[i][j];
        }
    }
    //std::copy(&mat[0][0], &mat[0][0] + m_r * m_c, &matrix[0][0]);
}