Почему функция сравнения STL не является членом?
Просто интересно, почему функция сравнения для stl::sort не может быть статическим членом?
У меня есть маленький маленький вспомогательный класс foo, который объявлен и определен в заголовке, но теперь мне нужно создать файл foo.cpp для реализации cmp(), чтобы он не был многократно определен.
Я также должен придумать подходящее имя, чтобы fooCmp() не конфликтовал с другими cmp().
Поскольку он не имеет доступа ни к каким переменным-членам, любая операция сравнения, которой требуется доступ к какому-либо другому значению (например, сортировать по расстоянию от foo.bar), нуждается в сложном вызове bind2nd.
3 ответа
Я не уверен, на что вы жалуетесь:
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());
}
На самом деле звучит так, как будто функция была объявлена в классе, определена в заголовке, но вне класса без встроенной связи
то есть что-то вроде:
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"
Если вас интересует несколько определенная функция сравнения, попробуйте объявить функцию с помощью static
связь. Тогда область действия функции не распространяется за единицу компиляции, где она найдена.
Тем не менее, ваша "функция" сравнения вовсе не обязательно должна быть функцией, но вместо этого может быть функциональным объектом. Функциональный объект очень похож на функцию, но реализован как 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;
}