まず第一に、私は C++ にかなり慣れていないので、これが初心者のコーディング ミスである場合は申し訳ありません。
私は現在、学校で受けた宿題のグラフ作成クラスに取り組んでいます。セット、配列、およびリンクされたリストにエッジを格納できるはずです。これらすべてを個別のクラスで行ったので、テンプレートを使用してすべてを 1 つにまとめようとしています。つまり、すべてが正常に機能します。std::set ですが、独自のリンク リストの実装を使用すると、どういうわけか失敗します。イテレータがどこかで台無しになり、前置演算子と後置演算子の両方が (for ループで) 同じ動作になるようです。また、リンクされたリストの独自の実装を作成することになっているため、std::list を使用していないことも付け加えておきます。
イテレータの現在の実装:
template<typename T>
class Iterator{
    public: node<T>* pointer;
    public:
        Iterator(): pointer(0){}
        Iterator(node<T>* _pointer): pointer(_pointer){}
        Iterator<T> operator++()    { pointer = pointer->next; }
        Iterator<T> operator++(int) { pointer = pointer->next; }
        bool operator!=(Iterator<T> rval){ return !(pointer == rval.pointer); }
        bool operator==(Iterator<T> rval){ return (pointer == rval.pointer); }
        node<T>* operator()(){ return pointer; }
        T operator*(){ return pointer->data; }
};
単一の連結リスト ノード:
template <typename T>
struct node{
    node(): next(0){}
    node(T val): data(val), next(0){}
    node(node<T>* _next): data(0), next(_next){}
    node(T val, node<T>* _next): data(val), next(_next){}
    T data;
    node<T>* next;
};
そして、リスト クラスが begin() と end() を実装する方法:
typedef Iterator<T> iterator;
iterator  begin()   { return iterator(new node<T>(b)); }
iterator  end()     { return iterator(); } 
bリンクされたリストの最初の要素を指していることに注意してください
最後に、要素にアクセスする方法 (これは、リストを含む別のクラスにあります):
void tree_recurse_f(int node, std::ofstream* file, int level = 0){
   [some output code here]
   typename T::iterator it;
   for (it = Database[node].first.begin(); it != Database[node].first.end(); ++it){
      tree_recurse_f(*it, file, (level+1));
   }
}
Database(セット、リスト、またはベクトル) で指定された型std::map<int,std::pair<>>を.first指すandです。T
今問題に:
- どういうわけか、リストの現在の実装ではbegin()、出力関数の空のノードを指しています (++it と it++ は同じ結果になります)。
- begin()を to に変更する- return iterator(b)と、for ループのエラーが取り除かれるように見えますが、++it と it++ はどちらも同じ結果になります。
- リストクラスのみをテストすることで、これら2つのエラーを発見することができました-グラフクラスに実装すると、出力関数で終わりのないループに入ります(*常に0を指し、+で増加しないようです) +それ)
私にはイテレータの奇妙なもののように見えます(特に、単独で機能するが、他のクラス内では機能しないという事実)
// 誰かが興味を持っているなら、私はhttp://www.cplusplus.com/articles/Lw6AC542/のリンクされたリストのチュートリアルに大まかに従っています