On Sun, 13 Feb 2011 09:29:14 -0500, Lutger Blijdestijn <[email protected]> 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

Reply via email to