Пользовательская функция сравнения Sort / stable_sort вызывает некоторые странные проблемы - PullRequest
0 голосов
/ 21 января 2020

У меня очень большой опыт работы с пользовательской функцией для 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, выдает неверную ошибку подтверждения компаратора.

  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 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
}

1 Ответ

0 голосов
/ 21 января 2020

Этот код:

if (input_a > input_b)
    return false;
else
    return true;

является запутанным способом сказать:

return !(input_a > input_b);

и отрицание greater then равно less or equal:

return input_a <= input_b; // logically same as before

Проблема в том, что вы не можете использовать отношение less or equal для сортировки, так как оно не обеспечивает строгое слабое упорядочение, требуемое алгоритмом. Вы можете использовать меньше:

return input_a < input_b;

или больше, чем вы использовали в своем коде, когда он работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...