Если вы хотите, чтобы оба ордера были постоянными, а элементы добавлялись и удалялись, вы можете использовать мультииндекс надстройки:
http://live.boost.org/doc/libs/1_34_0/libs/multi_index/doc/tutorial/basics.html#multiple_sort
Этот пример с этой страницы очень похож на тот, который вы хотите, за исключением того, что он отсортирован в обратном порядке:
multi_index_container<
int,
indexed_by<
sequenced<>, // sequenced type
ordered_unique<identity<int> > // another index
>
> s;
Если вы хотите использовать его как разовую операцию, ваша идея сортировки указателей звучит хорошо. В качестве небольшого варианта вы можете создать вектор std::pair<int,size_t>
, каждая пара которого состоит из значения, за которым следует его индекс. Затем отсортируйте вектор пар с помощью std::sort
и укажите std::greater<std::pair<int,size_t> >
в качестве компаратора.
Edit:
Учитывая ваш реальный случай, я бы определенно посоветовал сортировать пары, потому что таким образом вам нужно только вычислить сумму каждого внутреннего вектора один раз и сохранить ее в паре. Если бы вы сортировали только указатели / индексы, вам пришлось бы рассчитывать две суммы для каждого сравнения. так:
typedef vector<vector<double> >::const_iterator It;
typedef pair<double, It> Pair;
vector<Pair> pairvec;
pairvec.reserve(input.size());
for (It it = input.begin(); it != input.end(); ++it) {
// some people would split this over multiple lines
pairvec.push_back(make_pair(accumulate(it->begin(), it->end(), 0.0), it));
}
sort(pairvec.begin(), pairvec.end(), greater<Pair>());
Тогда вы можете перебрать парочку. Сделайте It
неконстантным итератором, если вам нужно.