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);
}
浙公网安备 33010602011771号