2017-08-18 9 views
3

私は現在、各ノードはベクトルに格納し、その後外側のオブジェクトに返されたASTARアルゴリズムを実装している - このように:外側のオブジェクトコードのルックスで時間/メモリ効率的なSTDとの仕事::ベクトル

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; 
    } 
} 

をこれに似て: - 他に、ものを行う - 多分それはパス(簡素化)を見つけるための時間ですfindPath()が存在する理由

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

理由は、私はそれが別のスレッドで実行するようにしたいので、パスが発見された場合ということです。煩わしいのはpath = astar.find();なのでコピーがたくさんできるので(のAstarクラスもコピーする価値はありません)私が考えた

可能な解決策は以下のとおりです。Astarfind();の引数としてはFooのstd::vector<Node> path;参照を渡すか、民間のパスにアクセスすることができましたので、FooFoo間とAstarで友情を作ります。それ以前には、時間とメモリの効率性(メモリを超える時間)があります。

+7

ベンチマークすれば驚くはずです。 * copy elision *と* return value optimization *に関する一般的な調査をいくつか行います。 *移動セマンティクスについてのいくつかの研究と同様に。 –

+1

'find()'でコピーと移動を減らすために 'reserve()'を使いたいかもしれません。 – Persixty

答えて

1

まず、C++ではReturn Value Optimizationが許されていることを覚えておいてください。値によってベクトルを返すこと自体に問題はありません。しかし

  • 一度だけ割り当てられる可能性のあるオブジェクトの繰り返しの割り当てを行うにはコストがかかります。したがって、理論的には、メソッドがパスの一部のバッファへの参照またはポインタを取るようにすることができます。十分なメモリが確保されている必要があります。このようにして、外部コードは一度だけ割り当てを行い、繰り返し呼び出しのためにそのバッファを再利用することができます。
  • あなたはそれを使用する予定がないオブジェクトを構築するのはコストがかかります。だから、has_path(const Node& source, const Node& target)という名前のメソッド、またはその機能を持つスタンドアロンの関数さえしたいかもしれません。
関連する問題