如何在每次迭代中创建新向量?
Posted
技术标签:
【中文标题】如何在每次迭代中创建新向量?【英文标题】:How to create new vector in each iteration? 【发布时间】:2011-12-02 02:31:17 【问题描述】:当我运行下面的代码时,在我的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)
【问题讨论】:
【参考方案1】:只是不要使用指针。
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。
【讨论】:
嘿,猫,我必须使用指针......神秘的答案对我有用。 因为 trainingVector 的元素 - 我需要修改它们而不调用 trainingVector @sks:这并不意味着您需要存储指针(这将需要您稍后delete
它们)。您可以使用引用,甚至稍后使用 &trainingVector[0]
获取指向现有向量的指针(这不需要删除,因为向量会处理它)。
嗯,我会试试...如果有什么坏了:)
@EtiennedeMartel 你也不是 :( 我希望你在骗孩子。【参考方案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);
虽然后一种方法意味着在将内部向量放入外部向量时复制内部向量。
【讨论】:
如果每个向量的生命周期只在迭代中持续,他将不会得到所有十个推入引用的输出,只有最后一个或没有,这取决于他何时检查父向量。问题是他不是每次都创建一个新向量,而是引用同一个向量(相同的内存位置,在堆栈上) 实际上,他所看到的(引用同一个)只是他通过访问超出范围的内容而导致的未定义行为的结果。 @Wizetux:错误。代码每次都创建一个 new 向量,并且每个向量仅在迭代中持续存在。稍后取消引用指针是未定义的行为,一切皆有可能。 非常感谢!第一件事正是我需要的。我不能使用第二个,因为我的 trainingVector 必须有指针... @Wizetux 无论它是否是相同的内存位置,它都不会改变堆栈上每个vector
的生命周期是循环的单次迭代这一事实。以上是关于如何在每次迭代中创建新向量?的主要内容,如果未能解决你的问题,请参考以下文章