У меня есть сценарий, который выглядит следующим образом:Сортировка члена класса с помощью пользовательского предиката
#include <algorithm>
using namespace std;
// a "heavy" struct with lots of members
struct B {
int key;
// other members
}
class A {
vector<B> bs;
}
Я хочу, чтобы отсортировать закладной по их ключам. Теперь, как я это делал в прошлом, чтобы избежать замены Bs (поскольку они довольно тяжелые), это определить вектор индексов и отсортировать индексы вместо этого. Это работает, если bs не является членом класса.
например.
vector<B> bs;
vector<size_t> indices;
bool pred(size_t i, size_t j) { return bs[i] < bs[j]; }
indices.resize(bs.size());
for (size_t i = 0; i < bs.size(); i++) indices[i] = i;
std::sort(indices.begin(), indices.end(), pred);
Однако, когда шс является членом класса, это «метод» не удается, потому что предикат может принимать только два параметра. В частности, нет способа передать «это».
Я вижу три пути решения этой проблемы:
- Не связывайтесь с индексами. Просто перегружать оператор
<
для обработки экземпляров B. Это целая индексы вещь просто преждевременная оптимизация :-) - Есть глобальный указатель на
bs
, установите его перед вызовомsort
, и использовать его вpred
. - Использовать затворы. Это было бы неплохо, если не использовать C++ 11.
Есть ли другой способ сделать это? Благодаря!
Ницца. Не думал об использовании функтора. Благодаря! – abeln
Даже лучше, я могу передать 'const B &' в конструктор 'Comparator'. Таким образом, мне не нужно предоставлять метод getter для 'bs'. – abeln