Creo que lo que realmente necesidad (pero corrígeme si me equivoco) es una manera de acceder a los elementos de un contenedor en un cierto orden.
En lugar de reorganizar mi colección original, me gustaría tomar prestado un concepto del diseño de la base de datos: mantener un índice ordenado por un determinado criterio. Este índice es una indirección adicional que ofrece una gran flexibilidad.
De esta manera es posible generar múltiples índices según los diferentes miembros de una clase.
using namespace std;
template< typename Iterator, typename Comparator >
struct Index {
vector<Iterator> v;
Index(Iterator from, Iterator end, Comparator& c){
v.reserve(std::distance(from,end));
for(; from != end; ++from){
v.push_back(from); // no deref!
}
sort(v.begin(), v.end(), c);
}
};
template< typename Iterator, typename Comparator >
Index<Iterator,Comparator> index (Iterator from, Iterator end, Comparator& c){
return Index<Iterator,Comparator>(from,end,c);
}
struct mytype {
string name;
double number;
};
template< typename Iter >
struct NameLess : public binary_function<Iter, Iter, bool> {
bool operator()(const Iter& t1, const Iter& t2) const { return t1->name < t2->name; }
};
template< typename Iter >
struct NumLess : public binary_function<Iter, Iter, bool> {
bool operator()(const Iter& t1, const Iter& t2) const { return t1->number < t2->number; }
};
void indices() {
mytype v[] = { { "me" , 0.0 }
, { "you" , 1.0 }
, { "them" , -1.0 }
};
mytype* vend = v + _countof(v);
Index<mytype*, NameLess<mytype*> > byname(v, vend, NameLess<mytype*>());
Index<mytype*, NumLess <mytype*> > bynum (v, vend, NumLess <mytype*>());
assert(byname.v[0] == v+0);
assert(byname.v[1] == v+2);
assert(byname.v[2] == v+1);
assert(bynum.v[0] == v+2);
assert(bynum.v[1] == v+0);
assert(bynum.v[2] == v+1);
}
Estoy de acuerdo con las dos respuestas, si se va para hacer esto más de una vez, aunque también podría hacer que la matriz ordenada cargue los valores de índice desde el principio o incluso crear una clase que contenga todos los datos que tiene en múltiples vectores y ordenar todos los datos a la vez. –
Lo sé, es 2015, pero me parece una solución súper elegante y fácil de implementar: http://stackoverflow.com/q/17554242/3093378 En realidad es similar a la respuesta aceptada, pero una Un poco más simple de imo, por lo que uno puede implementar un 'custom_sort' que devuelve un' std :: vector 'de índices, similar a MATLAB. –
vsoftco
Vea aquí mi respuesta a una pregunta duplicada: https://stackoverflow.com/questions/838384/reorder-vector-using-a-vector-of-indices/46370247#46370247 – cDc