天天看點

d找關聯數組并疊代

​​原文​​

找關聯數組并疊代

我正在​

​固定​

​​的​

​串清單​

​​中搞​

​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);
    }
}      

繼續閱讀