Si desea mantener ambos órdenes como algo continuo, mientras que se agregan y se quitan elementos, entonces se podría impulsar el uso de múltiples índice:
http://live.boost.org/doc/libs/1_34_0/libs/multi_index/doc/tutorial/basics.html#multiple_sort
Este ejemplo de esa página es más o menos lo desea, a excepción ordenada en el orden inverso:
multi_index_container<
int,
indexed_by<
sequenced<>, // sequenced type
ordered_unique<identity<int> > // another index
>
> s;
Si lo que desea es como una operación de una sola vez, su idea de clasificar los punteros suena bien. Como una pequeña variante, puede crear un vector de std::pair<int,size_t>
, cada par consiste en un valor seguido de su índice. Luego, clasifique el vector de pares con std::sort
y especifique std::greater<std::pair<int,size_t> >
como el comparador.
Editar:
Dada su caso real, definitivamente aconsejaría clasificación pares, porque de esa manera es suficiente para calcular la suma de cada vector interior de una vez, y almacenarlo en la pareja. Si estuvieras clasificando solo punteros/índices, tendrías que calcular dos sumas para cada comparación. entonces:
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>());
Luego puede iterar sobre pairvec. Haga It
un iterador no const si es necesario.
Gracias por esta respuesta. No sabía sobre impulsar multi-índice antes. Sin embargo, parece un poco demasiado complejo para lo que estaba haciendo, que es solo una operación única. – Jared
@Jared: He editado mi respuesta en función de su edición. –