¿Cómo tener un vector de byvalue y usar un vector de punteros en conjunto?
Pregunta
Tengo algunos vectores de objetos de clase A:
std::vector<A> *V1;
std::vector<A> *V2;
etc
hay una función con un vector de punteros de A:
std::vector<A *> *arranged;
lo que necesito hacer es poner los vectores de V1, V2, etc. dispuestos en el interior sin destruirlos al final, así que pensé que un vector de punteros a esos objetos ... ¿es esto posible? Si es así, ¿puede darme un ejemplo de una iteración con la variable V1 y agregar punteros de esos objetos en ordenados?
imagina que, temporalmente, necesitas clasificar 3 vectores de objetos en un vector pero no quieres desordenar la memoria de los 3 vectores.
ty,
Joe
Solución
Podrías escribir tu propio comparador. En este caso, el comparador funcionaría en A *
. Un ejemplo simple utilizando el tipo int
:
void fun(vector<int*>* vec)
{
/////////
}
bool comp(int* lhs, int* rhs)
{
return *lhs < *rhs;
}
int main()
{
vector<int> first, second;
vector<int*> vec;
for(vector<int>::size_type i = 0; i < first.size(); ++i)
vec.push_back(&first[i]);
for(vector<int>::size_type i = 0; i < second.size(); ++i)
vec.push_back(&second[i]);
// write your own comparator! provided above: comp
sort(vec.begin(), vec.end(), comp);
fun(&vec);
return 0;
}
Otros consejos
Si te entiendo correctamente, tienes varios vectores que contienen algún tipo de objeto (A) y quieres crear un nuevo vector que contenga la composición de todos los miembros de los otros vectores sin copiar realmente los objetos, o ¿De otra manera perturbaría sus vectores de propiedad de alguna manera?
Primero: ¿existe definitivamente la vida del nuevo vector compuesto de modo que ninguno de sus vectores fuente cambie? Es decir: no puede simplemente tener punteros sin procesar en los vectores de origen de su vector compuesto si esos punteros se invalidarán durante la vida útil de su compuesto.
Si la respuesta a esta pregunta es distinta de " definitivamente, los punteros seguirán siendo válidos " luego debe considerar el uso de punteros compartidos, o algo similar, de modo que la alteración de los vectores de origen no dejará su vector compuesto en un estado no válido (es decir, no lo dejará apuntando a una memoria aleatoria).
Suponiendo que los vectores de origen permanecerán sin cambios en términos de sus propios contenidos durante la vida útil de su composición, entonces la respuesta simple es " Sí "
vector<A> source1;
vector<A> source2;
vector<A> source3;
vector<const A*> composite; // this is a sorted vector of the above vectors' contents (by pointer)
Para el vector compuesto, necesitaría poner el contenido (por copia) de source1-3 en él, y luego clasificarlo (o podría usar un contenedor ordenado, y clasificar a medida que inserta los elementos). Deberá definir su propio operador de clasificación, uno que elimine las referencias de los punteros y aplique cualquier algoritmo de clasificación en los objetos de destino en sí mismos.
¿Eso te ayuda?