En el siguiente ejemplo (que también se puede ver en Ideone), tengo un vector de un clase y dentro de la clase tengo un elemento también vector.

El problema es que cuando se realiza el push_back de la clase, el vector interno vetint debe comenzar desde el principio nuevamente, para cada push_back de la primera dimensión, pero c ++ contiene los valores anteriores, de ahí el vector dobles.

#include <iostream>
#include <vector>

using namespace std;
class classe
{
public:
    int var;
    vector<int> vetint;
};


int main()
{
    vector<classe> vetor;
    classe obj;

    for (unsigned i=0; i<2 ; i++) {
        obj.var = (i+1)*10;
        for (unsigned c=0; c<3 ; c++) {
            obj.vetint.push_back((c+1)*100);
        }
        vetor.push_back(obj);
    }
    for (unsigned i=0; i < vetor.size() ; i++) {
        cout << "var(" << i << ") = " << vetor[i].var << endl;
        for (unsigned c=0; c < vetor[i].vetint.size() ; c++) {
            cout << "vetint(" << c << ") = " << vetor[i].vetint[c] << endl;;
        }
    }
}

Produce este resultado:

var(0) = 10
vetint(0) = 100
vetint(1) = 200
vetint(2) = 300
var(1) = 20
vetint(0) = 100
vetint(1) = 200
vetint(2) = 300
vetint(3) = 100
vetint(4) = 200
vetint(5) = 300

Cuando la deseada sería:

var(0) = 10
vetint(0) = 100
vetint(1) = 200
vetint(2) = 300
var(1) = 20
vetint(0) = 100
vetint(1) = 200
vetint(2) = 300

¿Por que sucede? ¿Cómo resolver?

0
Rogério Dec 29 may. 2018 a las 05:49

3 respuestas

La mejor respuesta

Si desenrolla el primer bucle for, su código será:

classe obj;

obj.var = (0+1)*10;
for (unsigned c=0; c<3 ; c++) {
   obj.vetint.push_back((c+1)*100);
}

// obj has three elements in it.
vetor.push_back(obj);

obj.var = (1+1)*10;
for (unsigned c=0; c<3 ; c++) {
   obj.vetint.push_back((c+1)*100);
}

// obj has six elements in it.
vetor.push_back(obj);

Eso explica por qué el vetint del segundo objeto en vetor tiene seis elementos.

Puede solucionar el problema utilizando uno de los siguientes métodos:

Solución 1

Mover la declaración / definición de obj dentro del bucle for.

for (unsigned i=0; i<2 ; i++) {
    classe obj;
    obj.var = (i+1)*10;
    for (unsigned c=0; c<3 ; c++) {
        obj.vetint.push_back((c+1)*100);
    }
    vetor.push_back(obj);
}

Solución 2

Borre el contenido de obj.vetint en el bucle antes de agregarle elementos.

for (unsigned i=0; i<2 ; i++) {
    obj.vetint.clear();
    obj.var = (i+1)*10;
    for (unsigned c=0; c<3 ; c++) {
        obj.vetint.push_back((c+1)*100);
    }
    vetor.push_back(obj);
}
4
R Sahu 29 may. 2018 a las 02:59

El problema es que nada hace que obj.vetint esté vacío después de tus primeros push_back s. Apriete el alcance de obj al bucle.

for (unsigned i=0; i<2 ; i++) {
    classe obj;
    obj.var = (i+1)*10;
    for (unsigned c=0; c<3 ; c++) {
        obj.vetint.push_back((c+1)*100);
    }
    vetor.push_back(obj);
}

También puede borrar explícitamente el contenido de obj.vetint (obj.vetint.clear()), así que elija. Por lo general, se prefiere ajustar el alcance, pero habría un ligero aumento del rendimiento en este escenario si borra (evitará reasignar la memoria en cada iteración del bucle).

2
Stephen Newell 29 may. 2018 a las 03:02

En el bucle for dentro de otro bucle for, está insertando valores enteros en un vector.

La primera vez insertará {100, 200, 300} y luego c será igual a 3. sale del bucle for interno. me convierto en 2 y luego llega al bucle interno. c se convierte en 0. nuevamente está insertando valores en el mismo vector. Entonces los valores del vector se convertirán en {100, 200, 300, 100, 200, 300}. Debe borrar la lista de vectores llamando a vectorname.clear () antes de incrementar el valor i.

1
Mankodaiyan 29 may. 2018 a las 03:04