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]
除了静态数组
有编译时
已知长度,一致
的元素.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现