為何std list通過begin 和rbegin 獲取到的迭代器,在插入元素後表現是不同的?

時間 2021-05-11 22:41:49

1樓:邱昊宇

問題的關鍵在於 reverse iterator 不是迭代器,而是迭代器介面卡(iterator adaptor)。[1]

標準中只要求 std::list 的 push_back 和 push_front 操作後迭代器仍然有效,並沒有關於迭代器介面卡的規定。[2]

所以第二個例子非常好理解:push_front 前 it 指向元素 0,操作後仍應該指向該元素。

而 rbegin 的效果是 reverse_iterator(end())

[3],因為 end 返回的迭代器應該在 push_back 後不變,仍然保持「最後乙個之後」的含義,所以第乙個例子中 push_back 後的 *it 按照 reverse iterator 的定義,應該解釋為 *(最後乙個之後 - 1),即當前的最後乙個元素 1。 [1]

此處不需要也不應該去看原始碼。

[5]除非找到了符合描述的特定說明(此處未找到),否則就應該認為不安全。即便可以根據某個特定的實現原始碼推斷執行緒安全,也只能說明操作在這個特定的實現下安全。

當然這些說的都是 C++11 開始的事情,在 C++11 之前理論上 C++ 沒有執行緒的概念。

2樓:劉雲賓

反向迭代器儲存的是對應正向迭代器的下一位置,假設, head--> 0 --> head即,it 指向的不是值為 0 的結點,而是值為 0 的結點對應的下一結點,即 head 結點

所以,當求 *it 時,相當於求 *(--it),即,結果為 0呼叫 l.push_front(1); 之後,相當於在 (0) 結點之後插入乙個結點,

即 head --> 0 --> 1 --> head所以,當求 *it 時,相當於求 *(--it),即,結果為 1至於正向迭代器就指向對應的結點,所以結果不變至於問題二,我覺得,執行緒不安全,乙個要讀,乙個要修改

3樓:stay

rbegin 本質上是 end,因此最開始鍊錶是這樣的0 -> end

顯然 push_back 會影響 rbegin 的取值,因為變成 0 -> 1 -> end了

反之,begin 的本質是 begin,因此 push_front 不會影響 begin 的取值

為何聯想小新pro14核顯版沒有通過evo認證?

執杖走天涯 很簡單,就是產品太次,沒辦法通過EVO的嚴苛測試。EVO認證的筆記本的條件之一,需配備有優質音訊功能 網路攝像頭和顯示器 您覺得您配嗎 拿到貨你會發現,並不是想某些知乎大佬所說的 意淫 YOGA高階模具的下放 7series好像是一種自嘲 後殼的不齊,螢幕的漏光。鍵盤左邊整排卡殼的感覺,...

對所有問題而言,通過問題求解答案和通過答案求解問題困難程度是否相等?為什麼?如何證明你的結論?

李發財 對 所有 問題的話,不好說。對大多數問題來說,往往知道答案以後做起來都會容易一點。舉個例子吧,世界上第一顆原子彈美國的 曼哈頓計畫 幾乎集中了西方國家最優秀的核科學家耗資20億美元,十多萬人參與研發,搞出來的。知道這個確定性結果,明白這個路子是可行的,中國當時在一窮二白的情況下用遠小於美國的...

CSS中能否通過設定margin top和margin bottom相等來垂直居中?

Yuki Cland 這個現象叫做外邊距合併,並且是其中的一種特殊情況。一般來說在表現模式為標準模式的網頁中,瀏覽器會自動合併塊級元素的上下邊距,例 html a bstyle head a adiv b bdiv body html 結果 這裡用肉眼也可以看到a和b之間的距離是100px,絕不可能...