如何按值(而不是按引用)复制 CPLEX IloArray,这是一个简单的方法

How to copy-by-value (not by reference) a CPLEX IloArray, the easy way

本文关键字:方法 一个 简单 复制 何按值 引用 CPLEX IloArray      更新时间:2023-10-16

我使用 CPLEX 并通过音乐会技术进行C++,我遇到的一个反复出现的问题是,在内部,IloArray结构似乎vector具有按引用复制运算符的结构重载。我必须承认,这是一种非常整洁且内存高效的处理数组结构的方法。

还。。。这意味着为先前声明和初始化的IloIntArray Array制作IloIntArray Array_copy = Array,将使Array的引用副本成为Array_copy。因此,Array的任何更改都会自动传输到 Array_copy .这同样适用于通过add()例程的多维IloArray结构。

例如,假设我需要填充一个 2D IloArray<IloIntArray> Array2D(env),在一个以 i = 1iSize 索引的 for 循环中,存储在Array2D[i]的每个位置,从 i = 1iSizeArray的值在循环的每次迭代中都会有所不同。制作:

  1. Array2D[i].add(Array)或,
  2. Array2D[i] = Array,假设Array2D i 维最初被设置为大小 iSize

无法进行预期的按值复制,因为每次都会对 i 维的元素进行按引用复制,并且您最终得到所有相同的元素,等于 Array 的最后一个值。

现在,此外,制作我自己的按值复制运算符构造函数(选项 I)或复制例程选项 II)接收源数组和目标数组以及要复制源数组的目标数组(例如多维数组)的位置。

有没有另一种方法可以按值复制?无论如何,您能帮我决定这些选项中哪一个更整洁和/或更节省内存吗?直觉上我认为选项 I 更有效率,但我不知道该怎么做......

提前感谢您的帮助Y

到目前为止,我正在通过实现 copy() 函数来解决我自己的问题。

我已经对我的多维数组进行了类型定义,如下所示:

三维或四维整数或数字数组的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();
}

欢迎您提出意见和/或更好的答案!!