Почему функция сравнения STL не является членом? - PullRequest
1 голос
/ 31 июля 2009

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 31 июля 2009

Я не уверен, на что вы жалуетесь:

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

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

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

    std::sort(a.begin(),a.end());
}
0 голосов
/ 31 июля 2009

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

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

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"
0 голосов
/ 31 июля 2009

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

Тем не менее, ваша "функция" сравнения не обязательно должна быть функцией, но может вместо этого быть функцией 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;
}
...