使用std :: vector

时间:2017-08-18 10:40:23

标签: c++ performance c++11 vector

我目前正在实施Astar算法,其中每个节点都存储在vector中,然后返回到外部对象 - 就像这样:

class Astar
{
   std::vector<Node> find()
   {
      std::vector<Node> open;
      std::vector<Node> closed;
      std::vector<Node> path;

      //A_star algorithm working with open and closed vectors
      //when path found fill path with push_back()

      return path;
   }
}

在外部对象代码中看起来类似于:

class Foo
{
   Astar astar;
   std::vector<Node> path;
   void findPath()
   {
      path = astar.find();
   }
   //do stuff with path
}

findPath()存在的原因是我想让它在另一个线程中运行,所以如果找到路径 - 做其他东西 - 也许是时候找路径了(简化)。困扰我的是path = astar.find();,因为它可能需要大量复制(更不用说push_back()类中的Astar也复制值了。

我想到的可能解决方案是:将Foo的std::vector<Node> path;引用作为参数传递给Astar的{​​{1}},或者在find();Foo之间建立友谊所以Astar可以访问私人路径。在我之前是时间和记忆效率(超过记忆的时间)。

1 个答案:

答案 0 :(得分:1)

首先请记住C ++允许Return Value Optimization,因此按值返回向量本身并不是问题。

然而:

  • 重复分配可能只分配一次的对象是很昂贵的。所以理论上你可以让方法为路径提供一个引用或指向某个缓冲区的指针,这必须保证有足够的内存。这样,外部代码甚至只分配一次,并且可以重复使用其缓冲区进行重复调用。
  • 构建一个您不打算使用它的对象是很昂贵的。因此,您可能需要一个名为has_path(const Node& source, const Node& target)的方法,甚至是一个具有该功能的独立函数。