mismatch and return value
Mike Parker via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Wed Jul 13 03:51:56 PDT 2016
On Wednesday, 13 July 2016 at 09:59:30 UTC, celavek wrote:
> Hi,
>
> I am trying to use the function "mismatch" from
> std.algorithm.comparison like so:
>
> int count = 0;
> auto m = mismatch(lhs, rhs);
>
> while (!m[0].empty)
> {
> ++count;
> m = mismatch(m[0], m[1]);
> }
>
> That goes into an infinite loop. What does mismatch return when
> it cannot
> actually find a mismatch? Is the return value immutable?
> I do not get any warnings from the compiler(dmd).
The return value is described as:
"a tuple with the reduced ranges that start with the two
mismatched values"
This means given the following:
void main()
{
import std.algorithm : mismatch;
import std.stdio : writeln;
auto lhs = [10, 20, 1, 22, 33, 44];
auto rhs = [10, 20, 2, 22, 33, 44];
auto m = mismatch(lhs, rhs);
writeln(m[0]);
writeln(m[1]);
}
The ranges following are printed:
[1, 22, 33, 44]
[2, 22, 33, 44]
If you feed these back to mismatch, the 1 and the 2 are sill the
mismatched values, so the return will again be identical:
[[1, 22, 33, 44],[2, 22, 33, 44]]
This is why you are getting an infinite loop, because the tuple
values you get from the first call are fed back into mismatch
infinitely. For your loop to work, you would need to pop the
first value from each range in the tuple. Something like this:
```
void main()
{
import std.algorithm : mismatch;
import std.stdio : writeln;
// This example is using arrays as ranges,
// so this is needed to give them the
// correct interface
import std.array : popFront, empty;
auto lhs = [10, 20, 1, 22, 33, 44];
auto rhs = [10, 20, 2, 22, 33, 44];
auto m = mismatch(lhs, rhs);
while(!m[0].empty && !m[1].empty) {
m[0].popFront();
m[1].popFront();
m = mismatch(m[0], m[1]);
}
writeln("empty");
}
```
The return value when there is no mismatch is a tuple of two
empty ranges. I've never used mismatch, but I learned everything
I needed about the return values beyond what the documentation
tells me by printing the return to the screen. Whenever you are
confused about what a range-based function returns, writeln is
your friend and can certainly save you some time.
More information about the Digitalmars-d-learn
mailing list