std::sort
шаблон, параметризованный над классом Compare Сама функция принимает объект этого класса в качестве аргумента и «вызывает» его для сравнения элементов контейнера, подлежащего сортировке.
Я предполагаю, что важно, чтобы мы могли дать сортировке конкретный объект, а не просто позволить сортировке создать сам объект сравнения. (Если нет, пожалуйста, поправьте меня.)
Теперь предположим, что мы хотим реализовать функцию foo
который принимает в качестве входных данных vector<T>
и функция сравнения для T
:
template <class T, class Compare>
bool foo(const vector<T>& v, Compare comp);
В рамках этой реализации мы хотим отсортировать другой вектор, содержащий пары T
и скажи, int
то есть сортировать vector<pair<T, int>>
, Но мы хотим отсортировать этот вектор на основе T
только компонент. Это означает, что мы хотим поднять данный ордер на T
на заказ pair<T, int>
и передать это std::sort
,
Как это можно сделать без использования лямбд? Моя проблема в том, что я не вижу способа поднять Compare
объект за T
одному для pair<T, int>
, Я могу только поднять Compare
учебный класс а затем построить объект этого, что означает, что foo
будет полностью игнорировать его comp
аргумент.
Благодарю.
Можете ли вы определить локальную структуру внутри функции, например?
template <class T, class Compare>
bool foo(const vector<T>& v, Compare comp)
{
struct NewCompare
{
const Compare &rc;
NewCompare( const Conpare &comp ) : rc( comp ) {}
NewCompare( const NewCompare &comp ) : rc( comp.tc ) {}
bool operator ()( const std::pair<T, int> &p1, const std::pair<T, int> &p2 ) const
{
return rc( p1.first, p2.first );
}
};
//...
}
Или вы можете написать общий функциональный адаптер.