使用push_back将向量<double>放入向量<vector <double >>

NiK*_*oCh 3 c++ stdvector

我有一个std::vector<vector<double>>我想填写一个功能.我需要在我的程序中稍后为某些计算存储一些3维坐标.

我的问题是如果我这样做:

//in classdefinition
std::vector<std::vector<double>> data;

    myFunc()
    {
        std::vector<double> temp;
        temp.push_back(1);
        temp.push_back(2);
        temp.push_back(3);
        data.push_back(temp);

        temp.clear();
        //new data
        temp.push_back(2);
        temp.push_back(3);
        temp.push_back(4);
        data.push_back(temp);
    }
Run Code Online (Sandbox Code Playgroud)

清除和重新填充temp会影响数据中的值吗?

我已经找到了这个http://www.cplusplus.com/reference/vector/vector/push_back/, 但由于解释是"将val的内容复制(或移动)到新元素." 我不知道该怎么想.对我来说,这听起来像是一个矛盾.

我认为如果变量作为参考传递是没有多大意义的,因为它们可以像我的情况一样只在有限的范围内有效.我的假设是对的吗?

Bat*_*eba 5

如果data是类型的std::vector<std::vector<double>>,那么你会感觉良好:一个值副本temp将采取; 所以temp在你用它作为push_back论据之后,你可以随心所欲地做.

但是,如果你对矢量的分配器搞砸了,那么你可能需要更加小心.

使用安置(请参阅emplace_back)可以避免不必要的深层复制:

// First row of data
{
    std::vector<double> temp = {1, 2, 3}; /*ain't C++11 brilliant?*/
    data.emplace_back(std::move(temp)); /*do not use temp after this line - 
                                use scope blocks so you're not tempted*/
}
Run Code Online (Sandbox Code Playgroud)

可以做到这一点作为一个单行,但实际上我怀疑你想要temp更多的照顾.所以我把两条线分开了.