【问题标题】:using push_back to put a vector<double> into a vector<vector<double>>使用 push_back 将 vector<double> 放入 vector<vector<double>>
【发布时间】:2016-06-21 09:02:12
【问题描述】:

我有一个std::vector&lt;vector&lt;double&gt;&gt; 我想填写一个函数。 我需要存储一些 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);
    }

temp的清空和refill会影响data中的值吗?

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

我认为,如果将变量作为引用传递,那将没有多大意义,因为它们就像我的情况一样,只能在有限的范围内有效。 我的假设是否正确?

【问题讨论】:

    标签: c++ stdvector


    【解决方案1】:

    如果datastd::vector&lt;std::vector&lt;double&gt;&gt; 类型,那么你没问题:将采用temp值副本;因此,在将 temp 用作 push_back 参数后,您可以随意使用它。

    但是,如果您弄乱了向量的 分配器,那么您可能需要更加小心。

    使用emplacement(见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*/
    }
    

    可以以单行方式执行此操作,但实际上我怀疑您想更加小心地填充temp。所以我把这两行分开了。

    【讨论】:

      【解决方案2】:

      正如您在文档中看到的,push_back 函数有两个重载版本

      void push_back (const value_type& val);
      void push_back (value_type&& val);
      

      第一个获取 const 引用 val 并将其复制到向量中。第二个使用右值引用(有关更多信息,请参阅move sematics)并将val 移动 val 到向量中,使源向量为空。 它们都不在向量中存储对临时对象的引用。

      第一个版本会在你传递时调用,例如,局部变量。

      std::vector<std::vector<double>> v;
      std::vector<double> lv = {1, 3, 7};
      v.push_back(lv);
      

      第二个 - 当你传递临时变量或显式移动变量时

      v.push_back(std::vector<double>({0, 17, 42}));
      v.push_back(std::move(lv));
      

      【讨论】:

      • 哦,对不起,我没有看到我选择了 C++98 而不是 C++11,因此我没有看到重载的函数并且很困惑。
      【解决方案3】:

      “复制”是指 push_back(temp),“(或移动)”是指 push_back(std::move(temp))

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-24
        • 2017-11-27
        相关资源
        最近更新 更多