【问题标题】: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)
}

【问题讨论】:

    标签: c++ pointers vector reference


    【解决方案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 的生命周期是循环的单次迭代这一事实。
    猜你喜欢
    • 2019-01-19
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 2022-07-08
    相关资源
    最近更新 更多