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

¿Fue útil?

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?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top