Sourcestd/container/rbtree.d
import std.algorithm.comparison : equal;import std.container.rbtree;auto rbt = redBlackTree(3, 1, 4, 2, 5);writeln(rbt.front);// 1assert(equal(rbt[], [1, 2, 3, 4, 5]));rbt.removeKey(1, 4);assert(equal(rbt[], [2, 3, 5]));rbt.removeFront();assert(equal(rbt[], [3, 5]));rbt.insert([1, 2, 4]);assert(equal(rbt[], [1, 2, 3, 4, 5]));// Query bounds in O(log(n))assert(rbt.lowerBound(3).equal([1, 2]));assert(rbt.equalRange(3).equal([3]));assert(rbt.upperBound(3).equal([4, 5]));// A Red Black tree with the highest element at front:import std.range : iota;auto maxTree = redBlackTree!"a > b"(iota(5));assert(equal(maxTree[], [4, 3, 2, 1, 0]));// adding duplicates will not add them, but return 0auto rbt2 = redBlackTree(1, 3);writeln(rbt2.insert(1));// 0assert(equal(rbt2[], [1, 3]));writeln(rbt2.insert(2));// 1// however you can allow duplicatesauto ubt = redBlackTree!true([0, 1, 0, 1]);assert(equal(ubt[], [0, 0, 1, 1]));
RedBlackTree(T, alias less = "a < b", bool allowDuplicates = false) if (is(typeof((ref const T a) => binaryFun!less(a, a))));Elem = T;Range = RBRange!(RBNode*);ConstRange = RBRange!(const(RBNode)*);ImmutableRange = RBRange!(immutable(RBNode)*);empty() const;length() const;ComplexityΟ(1).
dup();ComplexityΟ(n)
opSlice();opSlice() const;opSlice() immutable;ComplexityΟ(1)
front() inout;ComplexityΟ(1)
back() inout;ComplexityΟ(log(n))
opBinaryRight(string op)(Eleme) constComplexityΟ(log(n))
opEquals(Objectrhs);ComplexityΟ(n)
toHash();clear();ComplexityΟ(1)
stableInsert(Stuff)(Stuffstuff)ComplexityΟ(log(n))
stableInsert(Stuff)(scope Stuffstuff)insert = stableInsert;ComplexityΟ(m * log(n))
removeAny();ComplexityΟ(log(n))
removeFront();ComplexityΟ(log(n))
removeBack();ComplexityΟ(log(n))
remove(Ranger);ComplexityΟ(m * log(n)) (where m is the number of elements in the range)
remove(Take!Ranger);ComplexityΟ(m * log(n)) (where m is the number of elements in the range)
removeKey(U...)(Uelems)removeKey(U)(scope U[]elems)removeKey(Stuff)(Stuffstuff)ComplexityΟ(m log(n)) (where m is the number of elements to remove)
Example
import std.algorithm, std.container;auto rbt = redBlackTree!true(0, 1, 1, 1, 4, 5, 7);rbt.removeKey(1, 4, 7);assert(equal(rbt[], [0, 1, 1, 5]));rbt.removeKey(1, 1, 0);assert(equal(rbt[], [5]));
upperBound(Eleme);upperBound(Eleme) const;upperBound(Eleme) immutable;ComplexityΟ(log(n))
lowerBound(Eleme);lowerBound(Eleme) const;lowerBound(Eleme) immutable;ComplexityΟ(log(n))
equalRange(this This)(Eleme);ComplexityΟ(log(n))
trisect(this This)(Eleme);ComplexityΟ(log(n))
toString(scope void delegate(const(char)[])sink, ref scope const FormatSpec!charfmt) const;elems...);stuff)redBlackTree(E)(E[]elems...);redBlackTree(bool allowDuplicates, E)(E[]elems...);redBlackTree(alias less, E)(E[]elems...)redBlackTree(alias less, bool allowDuplicates, E)(E[]elems...)redBlackTree(Stuff)(Stuffrange)redBlackTree(bool allowDuplicates, Stuff)(Stuffrange)redBlackTree(alias less, Stuff)(Stuffrange)redBlackTree(alias less, bool allowDuplicates, Stuff)(Stuffrange)| allowDuplicates | Whether duplicates should be allowed (optional, default: false) |
| less | predicate to sort by (optional) |
E[]elems | elements to insert into the rbtree (variadic arguments) |
Stuffrange | range elements to insert into the rbtree (alternative to elems) |
import std.range : iota;auto rbt1 =redBlackTree(0, 1, 5, 7);auto rbt2 =redBlackTree!string("hello","world");auto rbt3 =redBlackTree!true(0, 1, 5, 7, 5);auto rbt4 =redBlackTree!"a > b"(0, 1, 5, 7);auto rbt5 =redBlackTree!("a > b",true)(0.1, 1.3, 5.9, 7.2, 5.9);// also works with rangesauto rbt6 =redBlackTree(iota(3));auto rbt7 =redBlackTree!true(iota(3));auto rbt8 =redBlackTree!"a > b"(iota(3));auto rbt9 =redBlackTree!("a > b",true)(iota(3));