向量中的向量在第二维中生成重复值

时间:2018-05-29 02:49:58

标签: c++ vector push-back

在下面的示例中(也可以在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 :(得分:4)

如果您展开第一个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);
}

答案 1 :(得分:2)

问题是,在您的第一个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.vetintobj.vetint.clear())的内容,所以请选择。通常首选缩小范围,但如果您清除(在每次循环迭代时都避免重新分配内存),在这种情况下会略微提升性能。

答案 2 :(得分:1)

在另一个for循环中的for循环中,您将整数值插入到向量中。

第一次插入{100,200,300}然后c等于3。它退出内部for循环。我变成2然后来到内循环。 c变为0。再次,您将值插入到同一向量中。因此矢量值将变为{100,200,300,100,200,300}。 在递增i值之前,必须通过调用vectorname.clear()来清除向量列表。