Использование той же функции для сортировки вектора <X>и пользовательского компаратора в наборе <X> - PullRequest
1 голос
/ 14 февраля 2012

Это может звучать как глупая проблема, но я долго удивлялся, есть ли способ лучше, чем этот:

struct X
{
    int a;
    int b;
};
bool sortComp(const X first, const X second)
{
    if (first.a!=second.a)
        return (first.a<second.a);
    else
        return (first.b<second.b);

}
class setComp
{
public:
    bool operator() (const X first, const X second) const
    {
        if (first.a!=second.a)
                return (first.a<second.a);
            else
                return (first.b<second.b);
    }
};
int main()
{
    vector<X> v;
    set<X, setComp> s;
    sort(begin(v), end(v),sortComp);
}

Как вы видите, я реализую одну и ту же функциональность дважды, один раз для сортировки и один раздля неявной сортировки в наборе.Есть ли способ избежать дублирования кода?

1 Ответ

5 голосов
/ 14 февраля 2012

Конечно, просто выберите один из двух и измените вызов другого.

// choosing the function object
sort(begin(v), end(v), setComp()); // create setComp, sort will call operator()

// choosing the function
set<X, bool(*)(const X, const X)> s(sortComp); // pass function pointer

Я лично рекомендовал бы версию функтора.

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