如何在Chapel中创建一个不规则的数组

问题描述 投票:2回答:1

我正在尝试创建所有不同长度的“数组数组”。例如

A = [[1 2 5 ]
     [3 5]
     [2 6 9]]

由于Chapel强类型,我不知道如何声明和填充A。我第一次使用它将迭代A并找到一组独特的元素,如

[1 2 3 5 6 9]

因此,查看构造和使用示例将非常有用。谢谢!

arrays chapel
1个回答
3
投票

我们将此功能称为“skyline”数组或“锯齿状”数组。虽然Chapel目前没有直接实现它,但很容易用记录来实现它。例如,外部数组的每个元素可以是携带相应内部数组及其域的记录:

record InnerArray {
  var dom: domain(1);  // starts out empty
  var arr: [dom] int;

  // Optional function: when printing an InnerArray, do not show the domain.
  proc writeThis(c: channel) { c.write("["); c.write(arr); c.write("]");  }
}

proc initElem(ref dest: InnerArray, src: []) {
  dest.dom = src.domain;
  dest.arr = src;
}

var A: [1..3] InnerArray;

initElem(A[1], [1,2,5]);
initElem(A[2], [3,5]);
initElem(A[3], [2,6,9]);

// The default printout invokes writeThis on each element of A.
writeln(A);

// To iterate over all inner elements, need nested loops.
// If appropriate, either/both can be "forall".
for outer in A do
  for inner in outer.arr do
    writeln(inner);
© www.soinside.com 2019 - 2024. All rights reserved.