Почему функция сравнения stl не является членом?
-
06-07-2019 - |
Вопрос
Просто праздно любопытно, почему функция сравнения для 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"