1

過去に、ノードを使用してリンクされたリストを実装しました。

標準ライブラリ リストのいくつかのプロパティを見ていますが、イテレータと適切なメンバー関数があります。

リスト内の反復子とは正確には何ですか? それらはノードポインタですか?

ベクターの場合、基本的に要素の型へのポインターがあり、データ構造はその特定の型の基になる動的配列に基づいて構築されます。

リストの場合、ノードのシーケンス、ノードの配列にすぎないようです。イテレータは、ノード データ型へのポインタではなく、ノード ポインタですか?

基本的に私が求めているのは、ベクトルにこのイテレータがあるかどうかです:

tyepdef T* iterator;

リストのイテレータは

typedef node* iterator;

ノードは次のようなものです。

template <class T> struct node {
    node() { next = 0; }
    node(T i, node* n = 0) : data(i), next(n) {}
    node* next;
    T data;
}

この場合、逆参照などの操作をオーバーロードする必要があるようです。

4

2 に答える 2

0

オブジェクトはstd::list<T>::iterator内部的にノードを指しますが、次または前のノードへのポインタを適切にたどる演算子があります。つまり、ポインターをインクリメントすると、リンクをたどるのではなく、ポインターが1つ追加されるだけなので、ポインターではありません。リスト反復子は次のようになると想像できます。

template <typename T>
class list_iterator {
    friend list<T>
    Node* node; 
    list_iterator(T* node):node(node) {}
    list_iterator& operator++() {
        node = node->next;
        return *this;
    }
    T& operator*() { return *node; }
     // ...
};
于 2013-11-09T22:21:43.730 に答える
0

リストの反復子は、 などの他のシーケンス コンテナーの反復子と同様に動作する必要がありますvector。つまり、それは list::value_type へのポインターのように動作する必要があります (++ と -- を使用して、次と前に移動する期待される操作を実行する)。保持構造の内部は、イテレータを通じて実際には公開されません。通常、反復子の抽象化により、プログラマーはデータの格納方法について考える必要がなくなります。将来的には、両方で利用可能な操作のみを使用している限り、理論的にはコードを変更せずstd::listに aに交換できます。std::vector

于 2013-11-09T22:22:10.110 に答える