d找关联数组并迭代

时间:2022-10-29 10:58:20


​原文​

找关联数组并迭代

我正在​​固定​​​的​​串列表​​​中搞​​DFS​​​之类.如​​生成​​​串排列,但是​​搜索​​​条件很复杂,要尽量"​​提前退出​​​".即,只要看到​​第一个或第二个​​​单词,就可​​修剪​​树枝.

import std;

void main() {
auto m = iota(20).map!(i => tuple(i, format!"value_%s"(i))).assocArray;

foreach (key; m.keys.sort.find(13)) {
writeln(m[key]);
}
}

有点类似​​C++​​​的​​向量双​​​了.
这样:

import std;

void main() {
int[string] map;
foreach (v ; 1 .. 9)
map[v.to!string] = v;
writeln(map); // 打印["8":8,"4":4,"7":7,"6":6,"1":1,"5":5,"2":2,"3":3]

auto something = "6";

auto pointer_to_something = (something in map);
if (pointer_to_something) {
writeln(*pointer_to_something); // prints 6
foreach (k, ref v ; map) {
if (&v == pointer_to_something)
break;
writeln(v); // prints 8 4 7
}
}
}

这样?

import std;

void main(){
int[int] a = [2 : 4, 5 : 6, 6 : 7, 10 : 12, 11 : 23 ];
bool cont = true;
foreach(k, v; a){ // 用引用
if (v != 7 && cont){
continue;
}
else{
cont = false;
writeln(k, ":", v);
}
}
/+
foreach(k, v; a.skipOver!((a, b) => a != b)(6)){ // 输入区间,可工作.
writeln(k, ":", v);
}
+/
}

可用,按​​键值​​:

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

void main()
{
auto aa = ["x": 123, "y": 456, "z": 789, "w": 10];

// 区间类型名是私有的,所以用`typeof(it)`
auto it = aa.byKeyValue;
typeof(it) saved;

// 保存位置
for (; !it.empty; it.popFront)
{
auto e = it.front;
if (e.key == "y")
saved = it.save;
writefln("%s: %s", e.key, e.value);
}

writeln("--------");

// 从保存位置迭代
foreach (e; saved)
writefln("%s: %s", e.key, e.value);
}

这里:

module main;

import std.stdio;

void main() {
int[string] m;
m["key1"] = 7;
m["key2"] = 8;

auto iter = m.byKeyValue();
// 步进
iter.popFront();
// 保留位置
auto iter2 = iter.save();
// 消耗第1迭代器
foreach (kv; iter) {
writeln("iter: ", kv.key, " = ", kv.value);
}
// 第2个看见啥
foreach (kv; iter2) {
writeln("iter2: ", kv.key, " = ", kv.value);
}
}