簡體   English   中英

外部雙鏈表迭代器c ++

[英]External Doubly Linked-list Iterator c++

我做了一個雙向鏈表。 在我的主體中,我需要使用一個外部List Iterator,它具有一個接受列表的構造函數。 這是我到目前為止的內容:

struct ListIterator : List {
    Node* cur = head;

    ListIterator(List* list) {
        this -> list = list;
    }

    bool hasNext() {
        return (cur -> next) != nullptr;
    }

    int next() {
        return list.at(cur -> next);
    }
};

這是我的主要:

List list1;

list1.append('I');
list1.append('D');
list1.append('F');
list1.append('G');
ListIterator it(list1);

while (it.hasNext()) {
   cout << it.next();
}

如您所見,我正在嘗試使用hasNext()和next()來顯示列表中的所有節點。 我對如何創建一個接受列表並在ListIterator struct中使用該函數的構造方法感到困惑。 任何提示和暗示將不勝感激。

您似乎深受Java(甚至C#)的影響。 這不是一件壞事,您只需要學習C ++的來龍去脈。

第一個問題是:在C ++中,值,引用和指針之間有明顯的區別。 當您聲明List類的實例時,如下所示:

List list1;

這實際上是一個價值。 該實例存在於堆棧中,並且在范圍結束時將被適當地處置(將調用析構函數)。

如果現在要初始化第二個列表,如下所示:

List list2 = list1;

這也是一個值,它將復制整個列表(將調用復制構造函數或賦值運算符)。 現在list1list2是兩個不同的列表實例,修改一個實例不會影響另一個實例。

無論如何,要獲得指向列表的指針,您需要以下語法:

List *listPtr1 = &list1;

由於它是一個指針,因此進行間接復制將不會復制基礎結構:

List *listPtr2 = listPtr1; // Will also point to list1

雖然使用正確的語法可以解決您的直接問題,但不能正確解決奇數迭代器的實現。

在C ++中,迭代器要么指向容器中的單個元素,要么指向過去 迭代器通常不知道容器自身是否到達了容器的末端。 相反,需要將其與該過去的迭代器進行比較。

容器通常定義一個begin方法,該方法將迭代器返回到第一個元素,一個end方法,將迭代器返回給past-the-end

通常使用以下原型在容器上進行迭代:

for (auto it = container.begin(); it != container.end(); ++it)
{
    // To access the element, you need to dereference the iterator:
    std::cout << "The current value is :" << *it << std::endl;
}

在這方面,迭代器的行為非常類似於指向元素的指針。 不需要笨拙的nexthasNext方法。 您只需將迭代器添加到容器的開頭,請確保一旦它指向past-the-end ,就停止迭代,並在要轉到下一個元素時將其遞增。

正確定義beginend方法的容器也可以在基於范圍的for循環中使用

for (auto &element : container)
{
    std::cout << "The current value is :" << element << std::endl;
}

我知道實現自己的容器很有趣而且很有教育意義。 我重新發明了相當多的輪子,只是為了了解事情是如何工作的,所以這沒有錯。 但是我建議您也許首先使用標准C ++容器,掌握C ++與Java和C#等語言之間的主要區別,然后再進行練習。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM