15

I am trying to sort some integers and make odd integers followed by even ones. I am using Visual Studio 2015.

Here's my code:

int w[]={1,2,3,4,5,6};
sort(w,w+6,[](const int&i,const int&j)->bool {
return (i&1)==(j&1)//When both are odd or even, the order is OK
||i&1;//if one is odd and one is even,check if the first one is odd
});

When executed, it encounters an error says "Expression: invalid comparator". I don't know why it would cause this error. How to modify it?

1 Answer 1

25

sort requires a strict weak ordering. Your comparator isn't one. Among many other things, for a strict weak ordering, comp(x, x) must be false.

sort is the wrong algorithm for this anyway (yes, you can contort it to do what you want; no, you shouldn't do it). What you want to do is a partition. For that, we have std::partition:

std::partition(std::begin(w), std::end(w), [](int x) { return x % 2 != 0; });

Or std::stable_partition, if you want the partition to be stable (preserve the relative order of elements).

Sign up to request clarification or add additional context in comments.

2 Comments

… it is possible to abuse sort for partitioning, but this is the best answer.
@Potatoswatter it would be (x % 2) < (y % 2)? (or > didn't think hard about which)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.