Chars sorting and copies

Steven Schveighoffer schveiguy at yahoo.com
Thu Oct 20 20:32:22 PDT 2011


On Thu, 20 Oct 2011 21:49:27 -0400, bearophile <bearophileHUGS at lycos.com>  
wrote:

> I have many strings and I want to use as associative array kay a sorted  
> concat of two strings (it's a signature of the two strings):
>
>
> import std.algorithm;
> void main() {
>     string a = "red";
>     string b = "green";
>     int[string] aa;
>     //aa[(a ~ b).sort] = 1;
>     //aa[(a ~ b).sort.idup] = 1;
>     aa[(a.dup ~ b.dup).sort.idup] = 1;
> }
>
> I think the first way used to work, the second way was recently  
> forbidden (and you can't use char[] as associative array key). The third  
> way now works, but array.sort will go away.
>
> So do you know what's a copy-minimizing (and possibly short) way to  
> perform this, in future?

a ~ b should technically be assignable to char[], since it's alread new  
memory.  We may yet get there with pure functions being able to implicit  
cast to immutable.

You could do this for now, but it's ugly:

char[] concatStr(string[] s...) pure
{
    auto len = 0;
    foreach(str; s) len += str.length;
    auto result = new char[len];
    auto slice = result;
    foreach(str; s)
    {
       slice[0..str.length] = str;
       slice = slice[str.length..$];
    }
    return result;
}

...

auto str = concatStr(a, b);
str.sort; // this is going to stop working, you'll have to cast to byte[]
aa[assumeUnique(str)] = 1;

There are also alternatives to AA (such as dcollections' HashMap) which  
are willing to take non-immutable keys.

-Steve


More information about the Digitalmars-d-learn mailing list