[英]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;
這也是一個值,它將復制整個列表(將調用復制構造函數或賦值運算符)。 現在list1
和list2
是兩個不同的列表實例,修改一個實例不會影響另一個實例。
無論如何,要獲得指向列表的指針,您需要以下語法:
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;
}
在這方面,迭代器的行為非常類似於指向元素的指針。 不需要笨拙的next
和hasNext
方法。 您只需將迭代器添加到容器的開頭,請確保一旦它指向past-the-end ,就停止迭代,並在要轉到下一個元素時將其遞增。
正確定義begin
和end
方法的容器也可以在基於范圍的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.