Вопрос

Просто праздно любопытно, почему функция сравнения для stl::sort не может быть статическим членом?

У меня есть небольшой вспомогательный класс foo, который объявлен и определен в заголовке, но теперь мне нужно создать файл foo.cpp для реализации cmp(), чтобы он не определялся многократно.

Мне также нужно придумать подходящее оформление имени, чтобы fooCmp() не конфликтовал ни с каким другим cmp().

Поскольку он не имеет доступа ни к каким переменным-членам, любая операция сравнения требует доступа к какому-либо другому значению (например.сортировка по расстоянию от foo.bar) требует сложного вызоваbind2nd.

Это было полезно?

Решение

Я не понимаю, на что вы жалуетесь:

std::sort(begin,end)        // use operator<
std::sort(begin,end,order)  // Where order is a functor

Итак, заказ может быть:

  • Функция
  • Статическая функция-член
  • Или объект, который ведет себя как функция.

Для меня работает следующее:

class X
{
    public: static bool diff(X const& lhs,X const& rhs) { return true;}
};

int main()
{
    std::vector<X>   a;

    std::sort(a.begin(),a.end(),&X::diff);
}

Но если класс имеет естественный порядок, то почему бы просто не определить для него оператор <.Это позволит вам получить доступ к членам и будет хорошо работать для большинства стандартных контейнеров/алгоритмов, которые должны определять порядок.

class X
{
    public: bool operator<(X const& rhs) const   {  return true;}
};
int main()
{
    std::vector<X>   a;

    std::sort(a.begin(),a.end());
}

Другие советы

Если вас интересует несколько определенная функция сравнения, попробуйте объявить функцию с помощью static связи. Тогда область действия функции не распространяется за пределы единицы компиляции, в которой она найдена.

Тем не менее, ваше сравнение " function " вообще не обязательно должна быть функцией, но вместо этого может быть функцией object . Функциональный объект очень похож на функцию, но реализован как operator(), который принимает соответствующие параметры в обычном классе. Поскольку это обычный класс, вы можете передавать параметры конструктора в этот класс.

Вот простой пример:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class comparator {
public:
    bool operator()(int a, int b) {
        return a < b;
    }
};

int main(int, char *[])
{
    vector<int> a;
    a.push_back(1);
    a.push_back(3);
    a.push_back(2);
    sort(a.begin(), a.end(), comparator());
    cout << a << endl;
}

на самом деле звучит как функция объявлен в классе, определено в заголовке, но вне класса без встроенной связи

то есть что-то вроде:

class foo{
public:
   static bool compare(const foo& lhs,const foo& rhs);
   ...
};
bool foo::compare(const foo& lhs,const foo& rhs){
   ...
} 

вместо

class foo{
public:
   static bool compare(const foo& lhs,const foo& rhs);
   ...
};
inline bool foo::compare(const foo& lhs,const foo& rhs){
   ...
} 

первый из которых будет определять функцию в каждом модуле компиляции, который

#includes "foo.h"
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top