En lugar de crear dos vectores/listas separadas, la forma habitual de manejar esto es la creación de un vector individual/lista de objetos que incluyen tanto los nombres y las edades:
struct person {
std::string name;
int age;
};
para obtener una especie basada en la edad , definen un comparador que se ve en las edades:
struct by_age {
bool operator()(person const &a, person const &b) {
return a.age < b.age;
}
};
Luego, su tipo sería algo como:
std::vector<person> people;
// code to put data into people goes here.
std::sort(people.begin(), people.end(), by_age());
Editar: En cuanto a elegir entre la definición de operator<
para la clase, o el uso de un objeto de comparación separado como he mencionado anteriormente, es sobre todo una cuestión de si hay un solo pedido que es "obvio" para esta clase.
En mi opinión, no es necesariamente obvio que la clasificación de personas siempre suceda por edad. Sin embargo, si en el contexto de su programa fuera obvio que clasificando personas se haría por edad, a menos que especifique lo contrario explícitamente, entonces tendría sentido implementar la comparación como person::operator<
en lugar de en una clase de comparación separada de la forma en que lo he hecho arriba.
El problema aquí es que el género moverá los elementos en 'Personas' pero no en 'Edades', por lo que perderá el acoplamiento real que existe. Busque las diversas respuestas que aconsejan agrupar los dos atributos para evitar perder la correspondencia. –
nota al margen: hay una diferencia entre el vector y la lista. Puede usar std :: sort para vectores pero debe usar la función de miembro especial std :: list <> :: sort para listas ya que no tienen iteradores de acceso aleatorio. – sellibitze