C++ 使用std::vector进行时间/内存高效工作

C++ 使用std::vector进行时间/内存高效工作,c++,performance,c++11,vector,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 wit

我目前正在实现一种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;
   }
}
类Astar
{
std::vector find()
{
std::矢量开放;
std::向量闭合;
向量路径;
//一种适用于开闭向量的_星算法
//找到路径时,使用push_back()填充路径
返回路径;
}
}
在外部,目标代码类似于以下内容:

class Foo
{
   Astar astar;
   std::vector<Node> path;
   void findPath()
   {
      path = astar.find();
   }
   //do stuff with path
}
class-Foo
{
阿斯塔阿斯塔;
向量路径;
void findPath()
{
path=astar.find();
}
//用路径做一些事情
}
之所以存在
findPath()
,是因为我想让它在另一个线程中运行,所以如果找到了路径——做些事情,否则——也许是时候找到路径了(简化)。困扰我的是
path=astar.find()因为它可能需要大量复制(更不用说
Astar
类中的
push_back()
也会复制值)


我想到的可能解决方案是:传递Foo的
std::vector路径引用作为
Astar
find()的参数
或在
Foo
Astar
之间建立友谊,以便
Foo
可以访问私有路径。在我之前是时间和内存效率(时间超过内存)。

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

然而:

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

如果您对其进行基准测试,我相信您会感到惊讶。具体研究了复制省略和返回值优化。以及一些关于移动语义的研究。您可能希望使用
reserve()
来减少在
find()
中的复制和移动。