вектор внутри вектора генерирует повторяющиеся значения во втором измерении - PullRequest
0 голосов
/ 29 мая 2018

В приведенном ниже примере (который также можно увидеть в Ideone ), у меня есть vector класса, и внутри класса у меня есть элемент также vector.

Проблема в том, что при выполнении push_back класса внутренний вектор vetint должен начинаться снова с начала, для каждого push_back первого измерения, но c ++ содержит предыдущие значения, поэтому вектор удваивается.

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

Это дает такой результат:

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

Когда желаемым будет:

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

Почему это происходит?Как решить?

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

Проблема в том, что ничто не делает obj.vetint пустым после ваших первых push_back с.Затяните область действия obj к петле.

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

Вы также можете явно стереть содержимое obj.vetint (obj.vetint.clear()), так что выбирайте.Сжатие области, как правило, предпочтительнее, но в этом сценарии будет небольшое повышение производительности, если вы очистите его (вы будете избегать перераспределения памяти при каждой итерации цикла).

0 голосов
/ 29 мая 2018

В цикле for внутри другого цикла for вы вставляете целочисленные значения в вектор.

В первый раз он вставит {100, 200, 300}, затем c станет равным 3.он выходит из внутреннего цикла for.я становится 2, а затем приходит во внутренний цикл.с становится 0.снова вы вставляете значения в один и тот же вектор.Значения вектора станут {100, 200, 300, 100, 200, 300}.Вы должны очистить список векторов, вызвав vectorname.clear (), прежде чем увеличивать значение i.

0 голосов
/ 29 мая 2018

Если вы развернете первый цикл for, ваш код будет:

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

Это объясняет, почему vetint второго объекта в vetor имеет шесть элементов.

Устранить проблему можно одним из следующих способов:

Решение 1

Перемещение объявления / определения obj внутри цикла 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);
}

Решение 2

Очистите содержимое obj.vetint в цикле, прежде чем добавлять в него элементы.

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