2017-05-27 71 views
-2

據我所知,迭代器的結束函數應該返回null。當我嘗試返回nullptr時,程序崩潰。有人可以解釋結束函數應該如何表現嗎?空的迭代器結束函數?

末()

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

更新

這是我的鏈表類。其他兩個嵌套在裏面。

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。檢查是否是這種情況。

編輯:

看到你下課後,我同意你的迭代器:: end()函數將返回nullptr。在你的實現中,你返回tail-> next,實際上它應該是nullptr,但是如果tail本身是nullptr(即你的列表中沒有節點),你的程序將會崩潰,因爲你試圖訪問一個對象的成員那是空的。 只要做:

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

運行gdb後,分段錯誤是由於tail返回nullptr造成的。那麼,一個人應該怎麼樣? – Deprecitus

+2

我不明白downvotes?答案是正確的?請不要從OP的代表判斷,但內容請。 –

+0

@Deprecitus它依賴於實現:如果你的鏈表使用''nulltpr''作爲末尾標記,那麼你可能想要返回''nullptr''。 – nefas