2011-10-21 17 views
-1

以下で説明されているもの、私がやっているのは非常に単純化した(と愚かな)抽象化して:構造のコピーを防止 - 再帰関数

class A{ 
private: 
    template <typename InIt> 
    A foo(InIt begin, InIt end, A& a) { 
     // {begin, ind} is a datastructure containing all "terms" to search for. 
     auto iter(sub.begin()); 
     auto e(sub.end()); 
     // search trough all elements in original structure. 
     do 
      if (FUNC) { 
       if (++begin != end) { 
        return iter->foo(begin, end, a.append_values(iter)); 
        //append_values appends a copy of the element's values at iter 
        //does not copy the sub "trees" of the element at "iter" 
        //it returns a reference to the appended sub "tree" 
       } else { 
        return a; 
       } 
      } 
     } while (++iter != e); 
     return a; 
    } 
}; 

サブは「A」クラスのオブジェクトを含むベクトルである - そうeffectivellyツリーデータ構造を作成する。 FUNCは、ブランチを新しいツリーに「追加」するために真でなければならない関数です。

私が疑問に思うのは、深さ(最初の開始点と終了点の差)が「X」であれば、どれだけ多くのコピーが作成されたかです。 - 私は深さごとに新しい "a"のコピーが作成されることを恐れています。これは私が避けたいものです。だから私は参考に返すべきですか? - またはポインタによって?

+0

イテレータから与えられた要素からデータ構造を構築した後で戻ってこないのですか? –

+0

ちょっとメモ:イテレータの型は 'OutIt'ではなく' InputIterator'という名前にしてください。それらは反復されたシーケンス内の値を読み書きするために使用されます。 –

+0

まあ、まさに、 "return a"ステートメントになります。しかし、それは再帰的な線を通って "後ろ"に歩いて行きます。そして、毎回構造体を返します。そして、それが価値あるものとして返ってくると、私はそれらがすべて一時的なものであることに気づくためにコンパイラのmerciにいます。しかし、コンパイラはこれを再帰関数で認識できますか? @luc、changed - good call :) – paul23

答えて

0

実際、UncleBensは正確な質問をしましたが、私は「解決策」を見つける必要がありました。
私は完全に "忘れてしまった"というのは、明らかに引数を引数として出力として使うこともできます。コピーではなく元の "a"を編集するときに何かを返す必要はありません。