在下面的示例中(也可以在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
为什么会这样?怎么解决?
答案 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
有六个元素。
您可以使用以下方法之一解决问题:
在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);
}
在向项目添加项目之前清除循环中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.vetint
(obj.vetint.clear()
)的内容,所以请选择。通常首选缩小范围,但如果您清除(在每次循环迭代时都避免重新分配内存),在这种情况下会略微提升性能。
答案 2 :(得分:1)
在另一个for循环中的for循环中,您将整数值插入到向量中。
第一次插入{100,200,300}然后c等于3。它退出内部for循环。我变成2然后来到内循环。 c变为0。再次,您将值插入到同一向量中。因此矢量值将变为{100,200,300,100,200,300}。 在递增i值之前,必须通过调用vectorname.clear()来清除向量列表。