d结构用作多维数组的索引

原文

import std.stdio;
import std.format;

struct indexedPair {
  size_t x, y;
}

struct MyArray {
  bool[3][3] elements;

  ref opIndex(indexedPair i) {
    return elements[i.y][i.x];
  }
}

void main() {
  auto arr = MyArray();
  auto p = indexedPair(1, 1);

  arr[p] = true;
  writeln(arr);
}

规范文档
按引用λ来修复它:

void toString(scope void delegate(in char[]) sink) const {
    import std.algorithm;
    sink.formattedWrite!"%-(%-(%s %)\n%)"(
      elements[].map!((ref row) => row[].map!(column => column ? 'T' : 'f')));
                  //   ^^^(引用)
  }

现在我看到了非常险恶的问题:组合静态λ数组参数与懒区间算法是灾难.以下程序打印垃圾,因为writeln打印元素时,这些元素在上的无效位置:

import std;

void main() {
  int[3][3] arr;

  writeln(
    arr[]               // 要切片
    .map!(row => row[]  // 要切片
          .map!(element => element))
  );//必须按引用取外部映的参数
}
//改为
.map!((ref row) => /* ... */)

基础:

int i;
int[N] arr;//这样放,类型 名;
int[] dynamicArray;
int[N] staticArray;
//类型,名
int[3][1] arr;  // Ali likes
int[1][3] arr;  // z wants
//
int[1][] a;  // int[1]的动态数组
int[][3] b;  // int[]的静态数组

D基本一致的:

void main()
{
  enum
  {
    Row = 2,
    Column = 3
  }
  size_t cal = Row * Column * int.sizeof;
  auto alloc = new ubyte[cal];
  size_t m = Column * int.sizeof;

  int[][] aSlice;
  foreach (i; 0 .. Row)
  {
    size_t n = i * m;
    aSlice ~= cast(int[])alloc[n .. n + m];
  }
  auto row = 2;
  auto column = 3;
  aSlice[row-1][column-1] = 1; //最后元素

  assert(
    *( &aSlice[0][0] // 第1个
     + (row * column - 1)
     )
  ); // 正确


  //看看嘛:
  import std.stdio;
  aSlice.writefln!"%-(%-(%s %)\n%)";
}

然而,没有行或列,因为D和C(或C++)都没有多维数组.它们都有在内存中元素连续布局的数组.
这是每个元素都是一列的数组的示例:

import std.stdio;
import std.range;
import std.algorithm;

void main() {
  // 2列,3行
  int[][] arr;
  arr.length = 2;
  foreach (ref column; arr) {
    column.length = 3;
  }

  setFirstColumn(arr, 1);
  printArray(arr);
}

void setFirstColumn(int[][] arr, int value) {
  // 第一个元素是我的第一列
  arr[0][] = value;
}

void printArray(int[][] arr) {
  // 逐行取,打印了转置
  arr.transposed.writefln!"%-(%-(%s %)\n%)";
}

又一例,为静态和动态数组输出以下内容:

import std.stdio;

void main() {
  enum X = 2;
  enum Y = 3;
  enum Z = 4;

  int[X][Y][Z] s;
  int[X][Y][] d = new int[X][Y][Z];

  pragma(msg, typeof(s));
  pragma(msg, typeof(d));
}

多维数组

new int[][][](5, 20, 30)
//==
int[30][20][5]
//而
new int[][][](5)
//==
int[][][5]

除了静态数组编译时已知长度,一致的元素.

posted @   zjh6  阅读(12)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示