簡體   English   中英

關於C ++中的列表

[英]Regarding Lists in C++

list<int>::iterator it;
  for ( it = l.begin(); it != l.end(); it++ )
    cout << *it << " ";
  cout << endl;

嗨,大家好,有人可以解釋一下“列表不允許隨機訪問”對於迭代器的含義嗎? 根據我的理解,我認為這意味着列表不會在數組和向量之類的連續內存位置中存儲內存,因此您不能對列表使用[]運算符,而必須遍歷整個列表來查找元素? 如果是這種情況,為什么允許您增加上面的迭代器?

非常感謝!

該聲明

列表不允許隨機訪問

並不意味着您不能訪問列表的任意(即所有)元素。 這通常意味着你不能訪問列表的隨機因素在同一時間 (“固定時間”或O(1)你可能會在這方面看到另一回事)。 例如,訪問第二個元素可能比訪問第1002個元素快(或慢)。

訪問某個任意元素的唯一方法是從一個明確定義的位置begin() (例如begin()rbegin()或您之前存儲的某個迭代器),然后一次向前或向后走一步。

將此與例如std::vector進行對比,它允許您在“ O(1)時間”中訪問任意元素,就像使用C數組(即,無論元素是哪個元素,訪問元素總是花費相同的時間)。

C ++中的列表是鏈接列表。 這意味着它們不會像向量數組那樣將數據存儲在連續的內存塊中。 相反,它們由多個節點組成,每個節點都有到下一個和上一個節點的鏈接。 列表本身僅保留指向第一個和最后一個節點的鏈接。 這允許在中間插入一個元素,而無需在計算上重新分配和復制其他元素。

當增加迭代器時,基本上就是在鏈接到列表的下一個節點。

因為迭代器不是指針,所以它看起來像一個指針。

當您說++it ,它只是it.operator++()的簡寫。 在該方法內,您可以執行任何所需的操作。 您不需要僅將一個添加到指針。

對於list :: iterator,它采用列表中下一個節點的地址。

好吧,您已經以某種方式自己回答了。

在列表中,您無法使用[]將“元素”“跳轉”到隨機元素,
是獲得下一個(與當前所在位置相比)。

從第一個元素開始,對每個元素進行操作,直到結束為止都沒有問題。
為第一個元素做某事,獲取下一個,做某事,獲取下一個...

每個節點包含下一個節點的地址。 通過迭代,您將自動跳至下一個節點。

暫無
暫無

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

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