2017-05-27 6 views
-2

私が理解するところでは、イテレータの終了機能はnullを返す必要があります。 nullptrを返そうとすると、プログラムがクラッシュします。誰かが最終的な機能がどう動くべきか説明することができますか?ヌルイテレータ終了関数?

エンド()

LinkList::Iterator LinkList::end() 
{ 
    return tail->next; 
} 

更新

は、ここに私のLINKLISTクラスです。他の2つは内部に入れ子になっています。

クラス

class LinkList 
{ 
public: 

class Node 
{ 
public: 
    Node() 
    { 
     next = prev = NULL; 
    } 
    Node(int num) 
    { 
     data = num; next = prev = NULL; 
    } 

    int data; 
    Node *next; 
    Node *prev; 
}; 

class Iterator 
{ 
public: 
    Iterator(Node* ptr); 
    Iterator operator ++(); 
    int operator *(); 
    bool operator ==(Iterator it); 
    bool operator !=(Iterator it); 
    Node *ptr; 
}; 

public: 
    LinkList(); 
    virtual ~LinkList(); 
    LinkList(const LinkList& other); 
    LinkList& operator=(LinkList& other); 

    bool insert(int num); 
    void insert(const initializer_list<int>& il); 

    void merge(LinkList & src); 
    Iterator *it; 
    Iterator begin(); 
    Iterator end(); 

    int size(); 
    void clear(); 

private: 
    Node *head, *tail, *temp; 
    int count; 
}; 
+1

間違ったことを理解しています。 –

+0

ここにはたくさんの詳細がありません。反復子は反復処理中のコンテナに大きく依存します。私は 'LinkList'型を見ています。うーん... – InternetAussie

+1

'end()'関数は反復処理中の要素の末尾*を表す有効なイテレータを返さなければなりません。 – Galik

答えて

3

イテレータの最後の機能は、またはそれはあなたの実装に依存し、nullptrを返さない場合があります。例えば、STLベクトルのend()関数は、ベクトルの最後の要素の後の位置を「指す」。

あなたが提供したコードから、あなたのプログラムがクラッシュする原因は何も言えませんが、end()関数を呼び出すと "tail"はnullptrになります。その場合はチェックしてください。

EDIT:

あなたのクラスを見た後、私はあなたのイテレータ::エンド()関数はnullptrを返さなければならないことに同意するものとします。実装ではtail-> nextを返します。実際にはnullptrでなければなりませんが、tail自体がnullptrの場合(つまり、リストにノードがない場合)、オブジェクトのメンバーにアクセスしようとするとプログラムがクラッシュしますそれはヌルです。 次のようにしてください:

LinkList::Iterator LinkList::end() { 
    return nullptr; 
} 
+0

gdbを実行した後、セグメンテーションフォルトはtailがnullptrを返すためです。だから、終わった後にはどうすればいいだろう? – Deprecitus

+2

私はdownvotesを理解していないのですか?答えは正しいですか?営業担当者からは判断しないでください。 –

+0

@Deprecitusこれは実装に依存します:もしあなたのリンクリストが '' nulltpr''を最後のセンチネルとして使うなら、 '' nullptr''を返すことができます。 – nefas

関連する問題