【问题标题】:Return 2D vector using pointer in C++在 C++ 中使用指针返回二维向量
【发布时间】:2013-08-08 18:04:27
【问题描述】:

全部

我正在使用 2D 向量将结果从函数返回到 main。二维向量非常大,函数执行了10K+次,所以我必须用指针返回它来加速它。

这是我的代码:

vector<vector<double>>* someFunction()
{
    vector<vector<double>> results;
    //do something...
    return &results;
}

主要是:

int main()
{
    // do something
    ////////// EDIT: vec is a pointer, I missed * at first place
    vector<vector<double>>* vec = someFunction();    // vec is empty!

    cout<<vec.size();        // size = 0

    return;
}

当我在main中查看vec的值和大小时,发现vec的大小是0。

我可以知道我错了吗?

非常感谢。

问候

【问题讨论】:

  • 1.它编译吗? 2. RVO 可能会删除副本,所以你可以按值返回
  • @Andrew 是的,它可以编译,但是当执行它时,由于我需要将结果写入文件,它会触发一些断点。
  • 永远不要返回指向局部变量的指针!
  • 在 C++11 中,您可以为此使用移动语义!
  • 可以给函数添加引用参数

标签: c++ pointers vector return


【解决方案1】:

您正在返回一个指向局部变量的指针。退出函数作用域时,此变量将不复存在,留下一个悬空指针。这是未定义的行为

只返回一个值:

vector<vector<double>> someFunction()
{
    vector<vector<double>> results;
    //do something...
    return results;
}

如果您担心按价值返回涉及的昂贵副本,请记住,这些很可能会通过 return value optimization (RVO) 被忽略,特别是返回值优化 (NRVO)。即使这没有发生(它是可选的,因此实现可以决定不这样做),在 C++11 中移动语义也会起作用。移动 std::vector&lt;double&gt; 非常便宜。

【讨论】:

    【解决方案2】:

    你返回一个指向向量的指针。去掉方法中的*:

    vector<vector<double>> someFunction()
    

    当然返回向量,而不是指向它的指针

    【讨论】:

      【解决方案3】:

      您不是在这里返回对局部变量的引用,因此超出了范围吗?让它成为类的成员,假设它在一个类中

      或者将引用作为参数传递给函数

      void someFunction(vector<vector<double>>& results)
      {
          results.clear();
      
          //do something...
      }    
      

      【讨论】:

        【解决方案4】:

        似乎已经有一个流行的答案,但是有一种方法可以使用动态内存分配来完全按照您的要求进行操作。我觉得这是值得指出的,因为虽然它可能不是解决这个特定问题的最佳方法,但动态内存分配通常是一种非常有用的技术。这个想法是“someFunction”应该创建一个指向动态分配的内存块的指针,该内存块将保存vector&lt;vector&lt;double&gt;&gt;。这是使用智能指针的工作代码,但如果您不喜欢 c++11,也可以使用传统的 newdelete 关键字进行分配:

        #include <memory>
        #include <vector>
        
        using namespace std;
        
        shared_ptr<vector<vector<double>>> someFunction() {
          vector<vector<double>> result;
          //Do stuff with result                                                                        
          shared_ptr<vector<vector<double>>> resultPtr =
            make_shared<vector<vector<double>>>(result);
          return resultPtr;
        }
        
        int main() {
          shared_ptr<vector<vector<double>>> ptr;
          ptr = someFunction();
          return 0;
        }
        

        就像我说的那样,这可能不是最好的方法,但要知道使用动态内存分配确实可以正确地返回指向本地对象的指针。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-13
          相关资源
          最近更新 更多