У меня очень большой опыт работы с пользовательской функцией для API sort / stable_sort. Ниже приведен исходный код под Windows Visual Studio 2017. Пожалуйста, помогите проанализировать, в чем проблема, я что-то упускаю или в чем заключается теория? Спасибо за помощь
// 10_3_1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define MAX_INPUT_NO (10u)
typedef bool(* sort_func_t)(const int input_a, const int input_b);
bool is_shorter(const int input_a, const int input_b)
{
#if 0
//this portion will show the iteration overlap
if (input_a > input_b)
return false;
else
return true;
#else
//both below works
//return input_a < input_b;
return input_a > input_b;
#endif
}
void elimDups(vector<int> &dat, sort_func_t func)
{
vector<int>::iterator temp = dat.begin();
std::stable_sort(dat.begin(), dat.end(), func);
//sort(dat.begin(), dat.end());
temp = unique(dat.begin(), dat.end());
dat.erase(temp, dat.end());
}
void print_vec(vector<int> &dat)
{
vector<int>::const_iterator index = dat.cbegin();
int i = 0;
for (; index < dat.cend(); index++)
{
cout << "dat[" << i << "] = " << dat.at(i++) << endl;
}
}
int main()
{
vector<int> a;
int ia[MAX_INPUT_NO] = {0, 1, 2, 1, 2, 3, 1, 2, 4, 5};
a.assign(ia, ia + MAX_INPUT_NO);
print_vec(a);
elimDups(a, is_shorter);
print_vec(a);
getchar();
return 0;
}
Но проблема, с которой я сталкиваюсь, когда играю с частью if-else, выдает неверную ошибку подтверждения компаратора.
- Если я определяю пользовательскую функцию, как показано ниже, используйте шаблон if-else, он работает нормально.
bool is_shorter(const int input_a, const int input_b)
{
#if 1
//this portion will show the iteration overlap
if (input_a > input_b)
return true;
else
return false;
#else
//below works
return input_a > input_b;
#endif
}
Ниже приведен результат, который я получаю.
ожидаемый результат от пункта 1
Если я определяю пользовательскую функцию компаратора, как показано ниже, она также использует шаблон if-else, она завершится ошибкой «Недопустимый компаратор».
bool is_shorter(const int input_a, const int input_b)
{
#if 1
//this portion will show the iteration overlap
if (input_a > input_b)
return false;
else
return true;
#else
//below works
return input_a > input_b;
#endif
}
Ниже приведено сообщение об ошибке, которое я получаю:
сообщение об ошибке от visual studio 2017
Но если я просто использую return, то он отлично работает в обоих направлениях.
bool is_shorter(const int input_a, const int input_b)
{
#if 0
//this portion will show the iteration overlap
if (input_a > input_b)
return false;
else
return true;
#else
//both below works
//return input_a < input_b;
return input_a > input_b;
#endif
}