I made a simple comaprison function that looks like this:
bool function(int a, int b){
if (a % 2 == 0) {
return (a > b);
}
if (a % 2 == 1) {
return (a < b);
}
return false;
}
My main function looks like this:
int main() {
vector<int> vector = {8, 4, 4, 8, 4, 1, 4, 4, 6, 10, 12 };
sort(vector.begin(), vector.end(), function);
cout << endl;
for (int i : vector) {
cout << i << " ";
}
return 0;
}
The function should arrange an array so that all even numbers are in one part of the array and all odd numbers are in another part of that array.
When I try to run the code, it gives me the error "invalid comparator". Any idea what could be wrong?
I'm assuming that you used this comparator in std::sort
. Then it must satisfy the requirement Compare:
For all a,
comp(a,a)==false
Ok, your comparator will always return false
for equal values.
If
comp(a,b)==true
thencomp(b,a)==false
That one fails:
function(1, 2) == true
, so 1 should come before 2, but ...function(2, 1) == true
, so 2 should come before 1, whoops.if
comp(a,b)==true
andcomp(b,c)==true
thencomp(a,c)==true
That one fails to: function(2, 1)==true
, function(1, 3)==true
, but function(2, 3)==false
.
This code should achieve what you want:
bool function(int a, int b){
if(a % 2 == b % 2) {
// If both are even or both are odd simply compare the numbers
return a < b;
}
else {
// if one is even and the other is odd then
// a should come before b if a is even
return a % 2 == 0;
}
}
Sorting [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
will result in [ 2, 4, 6, 8, 1, 3, 5, 7, 9, ]