如何在每次迭代中创建新向量?

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 它们)。您可以使用引用,甚至稍后使用 &amp;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 的生命周期是循环的单次迭代这一事实。

以上是关于如何在每次迭代中创建新向量?的主要内容,如果未能解决你的问题,请参考以下文章

如何避免在数据库中创建新列

如何在solrj中创建新核心

测试变量向量并在表上求和,在R中创建新列

在 R 中创建新的数据框列,以行值为条件而不进行迭代?

每次在linux的目录中创建新文件时运行一个进程

如何在C中创建连续循环,其中循环的每次迭代在其内部循环的每次迭代中发生一次