d中的列表

原文
只需使用类似C++向量的T[],
每个集合都有自己特殊接口.面向对象不适合集合.如,你不希望索引链表.
Java中有数组列表,在C++中有std::vector'等等.它们幕后都是动态数组.
数组链表好得多,链表用途不大.
0,数组使用的内存更少
1,提供常数时间访问元素
2,常数时间加元素
3,有时,常数时间删元素(删最后元素)
4,排序后,可在logN时间内查找元素
5,数组从CPU获得特殊帮助(如预取缓存)

D用区间示例列表:

struct List(A) {
  A[] *arr;

  auto put(R)(R value) { (*arr) ~= value; }
  auto length() { return (*arr).length; }

  auto empty() {
    import std.range : empty;
    return (*arr).empty;
  }

  auto front() {
    import std.range : item = front;//back;
    return (*arr).item;
  }

  void popFront() {
    import std.range : next = popFront;//popBack
    (*arr).next;
  }
}

auto listHelper(A)(return ref A[] arr) {
  return List!A(&arr);
}

alias immutable(char[]) [] strings;

void main() {
  strings myNames = ["El-Mevla", "Hodja", "Nasreddin", "Sivrihisar", "Shemseddin", "Nasruddin", "Nusrat"];
  strings list;
  auto myList1 = listHelper(list);

  import std.range;
  auto myList2 = appender!strings;

  import std.container.array;
  auto myList3 = Array!string();

  foreach(name; myNames)
  {
    myList1.put(name);
    myList2.put(name);
    myList3.insert(name);
  }

  void rangePrint(R)(R range)
  {
    import std.stdio;
    size_t i = 1;
    foreach(item; range)
    {
      writeln(i++, ": ", item);
    }
    writeln;
  }

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