2011-12-02 58 views
1

当我运行下面的代码,在我trainingVector我得到:替代如何在每次迭代中创建新的向量?

{(10,0),(10,0),(10,0)...} 

{(0,0),(1,0),(2,0)...} 

我如何正确地做这项工作?

vector< vector<double> * > trainingVector; 
for(int i=0;i<10;i++){  
    vector<double> ok (2,0); 
    ok[0]=i; 
    trainingVector.push_back(&ok) 
} 

回答

2

你使用的是现在不会起作用,因为每个矢量ok对象的生命周期只持续内迭代它超出范围之前和死亡的方法。

你需要做这个:

vector< vector<double> * > trainingVector; 
for(int i=0;i<10;i++){  
    vector<double> *ok = new vector<double>(2,0); 
    (*ok)[0]=i; 
    trainingVector.push_back(ok); 
} 

请注意,您将需要手动稍后释放每个内部向量。否则你会得到内存泄漏。

for(int i=0;i<10;i++){  
    delete trainingVector[i]; 
} 

或者,你可以不用指针一起:

vector< vector<double> > trainingVector; 
for(int i=0;i<10;i++){  
    vector<double> ok(2,0); 
    ok[0]=i; 
    trainingVector.push_back(ok); 
} 

虽然这后一种方法意味着复制内部矢量,当它被放入外载体。

+0

如果每个向量的寿命只持续在迭代中,他不会得到所有十个推入引用的输出,只是最后一个或没有,这取决于他检查父向量的时间。问题在于他不是每次都创建一个新的向量,而是引用同一个(相同的内存位置,在堆栈中) – Wizetux

+0

实际上,他所看到的(引用同一个)仅仅是未定义行为的结果他是通过访问已经超出范围的东西而造成的。 – Mysticial

+1

@Wizetux:*错误*。代码每次创建一个* new *向量,并且每个向量仅在迭代中持续。稍后解引用指针是未定义的行为,并且一切都是可能的。 –

4

只是不要使用指针。

std::vector<std::vector<double>> trainingVector; 
for (int i = 0; i < 10; ++i) { 
    std::vector<double> ok(2, 0); 
    ok[0] = i; 
    trainingVector.push_back(ok); 
} 

也可以考虑用Boost.MultiArray代替。

+0

嘿,猫,我必须使用指针......神秘的答案为我工作。 – sks

+0

@sks:因为为什么? –

+0

,因为训练矢量的元素 - 我需要修改它们而不用调用训练矢量 – sks

相关问题