vector within vector generates duplicity of values in the second dimension

1

In the example below (which can also be seen in the Ideone ), I have vector of a class and within class I I have an element also vector .

The point is that when doing push_back of the class, the internal vector vetint should start from zero every% of% of the first dimension, but c ++ is holding the previous values, hence the vector doubles.

#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 this result:

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

When the desired one would be:

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

Why does this happen? How to solve?

    
asked by anonymous 29.05.2018 / 04:10

1 answer

2

The problem happens because the method push_back() copies the obj element through execution of a copy constructor.

An example of this constructor would be:

// Construtor de cópia da classe
classe(classe const &c)
{
    var = c.var;
    vetint = c.vetint;
}

Therefore, the vetint vector is copied along with the elements already in it, causing the problem of double values.

One possible solution is to create a new instance at each looping iteration that inserts the object into the vetor vector:

#include <iostream>
#include <vector>

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

int main()
{
    vector<classe> vetor;

    for(unsigned i=0; i<2 ; i++) {
        classe obj; // AQUI: cria uma instância nova a cada iteração

        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;;
        }
    }
}

After execution, the output occurs as expected:

var(0) = 10
vetint(0) = 100
vetint(1) = 200
vetint(2) = 300
var(1) = 20
vetint(0) = 100
vetint(1) = 200
vetint(2) = 300
    
29.05.2018 / 04:52