On 9/22/22 03:53, Salih Dincer wrote:
> Is there a more accurate way to delete the '\0' characters at the end of
> the string? I tried functions in this module:
> https://dlang.org/phobos/std_string.html

Just to remind, the following are always related as well because strings are arrays, which are ranges:

  std.range
  std.algorithm
  std.array

>        r ~= c;

Stefan Koch once said the ~ operator should be called "the slow operator". Meaning, if you want to make your code slow, then use that operator. :)

The reason is, that operation may need to allocate memory from the heap and copy existing elements there. And any memory allocation may trigger a garbage collection cycle.

Of course, none of that matters if we are talking about a short string. However, it may become a dominating reason why a program may be slow.

I was going to suggest Paul Backus' solution as well but I may leave the array part out in my own code until I really need it:

string noZeroes(string s)
{
    return s.byCodeUnit.filter!(c => c != '\0');
}

Now, a caller may be happy without an array:

    auto a = s.noZeroes.take(10);

And another can easily add a .array when really needed:

    auto b = s.noZeroes.array;

That may be seen as premature optimization but I see it as avoiding a premature pessimization because I did not put in any extra work there. But again, this all depends on each program.

If we were talking about mutable elements and the order of elements did not matter, then the fastest option would be to remove with SwapStrategy.unstable:

import std;

void main() {
    auto arr = [ 1, 0, 2, 0, 0, 3, 4, 5 ];
    arr = remove!(i => i == 0, SwapStrategy.unstable)(arr);
    writeln(arr);
}

unstable works by swapping the first 0 that it finds with the last non-zero that it finds and continues in that way. No memory is allocated. As a result, the order of elements will not preserved but unstable can be very fast compared to .stable (which is the default) because .stable must move elements to the left (multiple times in some cases) and can be expensive especially for some types.

The result of the program above is the following:

[1, 5, 2, 4, 3]

Zeros are removed but the order is not preserved.

And very important: Don't forget to assign remove's return value back to 'arr'. ;)

I know this will not work for a string but something to keep in mind...

Ali


Reply via email to