using a binary tree container
Steven Schveighoffer
schveiguy at yahoo.com
Mon Feb 14 06:32:08 PST 2011
On Sun, 13 Feb 2011 09:29:14 -0500, Lutger Blijdestijn
<lutger.blijdestijn at gmail.com> wrote:
> Dominic Jones wrote:
>
>> Hello,
>>
>> I have a list of strings and I want to determine whether or not a
>> particular string in the is in that list. Assuming I should store the
>> list
>> of strings in a binary tree to facilitate fast searching, I had a look
>> at
>> the std.container documentation and found RedBlackTree, but the
>> documentation for it has no examples. May someone offer an example of
>> how
>> to use it?
>>
>> Thank you,
>> Dominic Jones
>
> I tried it out and it's simple to use but I stumbled upon some issues.
> (See
> below) As others have commented, regular AA's will work fine for this
> purpose too. Probably the best reason why you would choose a RedBlackTree
> over AA is when you also need them sorted, this you get for free. A tree
> is
> also likely to consume less memory, which may or may not matter.
>
> Example:
>
> import std.stdio;
> import std.container;
>
> void main()
> {
> auto stuff = ["foo", "bar"];
> /* using make instead of the constructor ensures the code will work
> when RedBlackTree will become a class: */
>
> auto set = make!(RedBlackTree!string)(stuff);
>
> /* iterates in order: */
> foreach( value; set )
> writeln(value);
>
> set.stableInsert("baz");
>
> /* the 'in' operator returns bool, not a pointer to the element like
> builtin aa's do: */
> assert( "baz" in set );
> }
>
> Now for the issues, this doesn't work but it should:
>
> auto set = make!(RedBlackTree!string)("foo", "bar");
>
> Error: template
> std.container.RedBlackTree!(string).RedBlackTree.__ctor(U)
> if (isImplicitlyConvertible!(U,Elem)) does not match any function
> template
> declaration
> Error: template
> std.container.RedBlackTree!(string).RedBlackTree.__ctor(U)
> if (isImplicitlyConvertible!(U,Elem)) cannot deduce template function
> from
> argument types !()(string,string)
> ...
>
>
> I couldn't see any function to remove a single element from the tree and
> std.algorithm.remove doesn't work. Removing a range also doesn't work for
> strings:
>
> set.remove(stuff);
>
> Error: function std.container.RedBlackTree!(string).RedBlackTree.remove
> (Range r) is not callable using argument types (string[])
> Error: cannot implicitly convert expression (stuff) of type string[] to
> Range
>
> I'll file these issues soon, when I have the time.
Yes, thank you. RedBlackTree is certainly not well-used, so it is bound
to have lots of usability issues.
-Steve
More information about the Digitalmars-d-learn
mailing list