如何按值(而不是通过引用)复制 CPLEX IloArray,这是一种简单的方法
How to copy-by-value (not by reference) a CPLEX IloArray, the easy way
我通过 Concert Technology 使用 CPLEX 和 C++,我遇到的一个反复出现的问题是 IloArray
结构在内部似乎被重载 vector
结构与按引用复制运算符。我必须承认这是处理数组结构的一种非常简洁且内存效率高的方法。
然而...这意味着对于先前声明和初始化的 IloIntArray Array
,制作 IloIntArray Array_copy = Array
会将 Array
的参考副本制作成 Array_copy
。因此,Array
中的任何更改都会自动传输到 Array_copy
。这同样适用于通过 add()
例程的多维 IloArray
结构。
例如,假设我需要在 i = 1
到 iSize
索引的 for 循环中填充一个 2D IloArray<IloIntArray> Array2D(env)
,存储在 IloArray<IloIntArray> Array2D(env)
的每个位置=23=],从 i = 1
到 iSize
,Array
的值在循环的每次迭代中都会不同。制作:
Array2D[i].add(Array)
或者,
Array2D[i] = Array
,假设 Array2D
i 维度最初设置为大小 iSize
。
无法进行预期的按值复制,因为每次都会对 i 维的元素进行按引用复制,最终得到所有相同的元素,等于最后一个值Array
.
现在,此外,制作我自己的 按值复制运算符 构造函数(选项 I) 或 copy routine (Option II) 接收源数组和目标数组以及要复制原始数组的目标数组(例如多维数组)的位置。
是否有另一种方法来制作按值复制?无论如何,你能帮我决定这些选项中的哪一个更整洁 and/or 内存效率吗?直觉上我认为 选项 I 更有效,但我不知道该怎么做...
在此先感谢您的帮助
Y
到目前为止,我正在通过实现 copy() 函数来解决我自己的问题。
我有 typedefed 我的多维数组如下:
typedef IloArray<IloIntArray> Ilo2IntArray;
和 typedef IloArray<IloNumArray> Ilo2NumArray
等等,用于三维或四维整数或数值数组。
我的 Ilo3IntArray copy(Ilo3IntArray origin)
复制函数重载的示例如下:
Ilo3IntArray copy(Ilo3IntArray origin) {
IloInt iSize = origin.getSize();
Ilo3IntArray destination(env, iSize);
IloInt jSize = origin[0].getSize();
IloInt zSize = origin[0][0].getSize();
for (IloInt i = 0; i < iSize; i++) {
destination[i] = Ilo2IntArray(env, jSize);
for (IloInt j = 0; j < jSize; j++) {
destination[i][j] = IloIntArray(env, zSize);
for (IloInt z = 0; z < zSize; z++) {
destination[i][j][z] = origin[i][j][z];
}
}
}
return destination;
// Freeing Local Memory
destination.end();
}
您的意见and/or欢迎更好的回答!!!
我通过 Concert Technology 使用 CPLEX 和 C++,我遇到的一个反复出现的问题是 IloArray
结构在内部似乎被重载 vector
结构与按引用复制运算符。我必须承认这是处理数组结构的一种非常简洁且内存效率高的方法。
然而...这意味着对于先前声明和初始化的 IloIntArray Array
,制作 IloIntArray Array_copy = Array
会将 Array
的参考副本制作成 Array_copy
。因此,Array
中的任何更改都会自动传输到 Array_copy
。这同样适用于通过 add()
例程的多维 IloArray
结构。
例如,假设我需要在 i = 1
到 iSize
索引的 for 循环中填充一个 2D IloArray<IloIntArray> Array2D(env)
,存储在 IloArray<IloIntArray> Array2D(env)
的每个位置=23=],从 i = 1
到 iSize
,Array
的值在循环的每次迭代中都会不同。制作:
Array2D[i].add(Array)
或者,Array2D[i] = Array
,假设Array2D
i 维度最初设置为大小iSize
。
无法进行预期的按值复制,因为每次都会对 i 维的元素进行按引用复制,最终得到所有相同的元素,等于最后一个值Array
.
现在,此外,制作我自己的 按值复制运算符 构造函数(选项 I) 或 copy routine (Option II) 接收源数组和目标数组以及要复制原始数组的目标数组(例如多维数组)的位置。
是否有另一种方法来制作按值复制?无论如何,你能帮我决定这些选项中的哪一个更整洁 and/or 内存效率吗?直觉上我认为 选项 I 更有效,但我不知道该怎么做...
在此先感谢您的帮助 Y
到目前为止,我正在通过实现 copy() 函数来解决我自己的问题。
我有 typedefed 我的多维数组如下:
typedef IloArray<IloIntArray> Ilo2IntArray;
和 typedef IloArray<IloNumArray> Ilo2NumArray
等等,用于三维或四维整数或数值数组。
我的 Ilo3IntArray copy(Ilo3IntArray origin)
复制函数重载的示例如下:
Ilo3IntArray copy(Ilo3IntArray origin) {
IloInt iSize = origin.getSize();
Ilo3IntArray destination(env, iSize);
IloInt jSize = origin[0].getSize();
IloInt zSize = origin[0][0].getSize();
for (IloInt i = 0; i < iSize; i++) {
destination[i] = Ilo2IntArray(env, jSize);
for (IloInt j = 0; j < jSize; j++) {
destination[i][j] = IloIntArray(env, zSize);
for (IloInt z = 0; z < zSize; z++) {
destination[i][j][z] = origin[i][j][z];
}
}
}
return destination;
// Freeing Local Memory
destination.end();
}
您的意见and/or欢迎更好的回答!!!