On Saturday, 16 March 2013 at 15:58:32 UTC, John Colvin wrote:
On Saturday, 16 March 2013 at 15:29:03 UTC, Peter Sommerfeld wrote:
Cannot find a reference: What is the best way
to catenate a string multiple times ?
Unfortunately this this does not work ;-)

string tab = "..";
tab = tab * 4; // -> "........"

Peter

There are very many different ways of doing this, here are a few.

using template recursion:

//Repeats string "s" size_t "num" times at compile-time
template RepeatString (string s, size_t num)
{
    static if(num == 0)
        const RepeatString = "";
    else
        const RepeatString = s ~ RepeatString!(s, num-1);
}


or for fast runtime performance (also works at compile-time), something like this:

//appends any array to itself multiple times.
T[] concat(T)(T[] arr, size_t num_times)
{
    auto app = appender!(T[])(arr);
    app.reserve(num_times);

    foreach(i; 0..num_times)
        app ~= arr;

    return app.data;
}


simpler but slower:

T[] concat_slow(T)(T[] arr, size_t num_times)
{
    auto result = arr;
    foreach(i; 0..num_times)
        result ~= arr;
    return result;
}


If you needed extreme performance there are faster ways, but they are much longer and more complex.

or, as bearophile points out, use std.array.replicate

I should really read over phobos again, I keep forgetting functions exist...

Reply via email to