簡體   English   中英

std::advance 在 std::list 末尾的行為

[英]The behavior of std::advance at the end of std::list

#include <iostream>
#include <list>
using namespace std;

int main() {
  list<int> A;
  A.push_back(1);
  A.push_back(2);
  A.push_back(3);

  auto it = A.begin();
  cout << *it << ' ';
  advance(it, 1);
  cout << *it << ' ';
  advance(it, 1);
  cout << *it << ' ';
  advance(it, 1);
  cout << *it << ' ';
  advance(it, 1);
  cout << *it << ' ';
}

我相信該list是一個雙向鏈表。 令人驚訝的是,output 是1 2 3 3 1 有人可以解釋這里發生了什么嗎? 以下是問題:

  1. 當我們前進兩次時,我們處於3的節點。 在這里,一個額外的advance將迭代器移動到A.end() 我相信A.end()是一個不指向原始元素的虛構節點。 但是,它打印出3 為什么?
  2. 怎么最后打印出1呢? list不是循環隊列。

取消引用結束迭代器是未定義的。 結束迭代器指向列表中的最后一個元素。 它不引用列表中的元素,因為沒有元素超過最后一個。

進一步推進結束迭代器也是未定義的。

您的程序有未定義的行為。

未定義的行為意味着任何事情都可能發生。 沒有未定義行為的代碼的運行時行為在語言標准中指定(有些是實現定義的或未指定的,但讓我們保持簡單)。 另一方面,當您的代碼具有未定義的行為時,您無法保證最終的程序運行時行為是什么。 您的 output 可能是"Hello World"

當然,output 不是"Hello World" ,您看到 output 是有原因的。 但是,這些原因與 C++ 的工作原理無關。 要了解為什么會得到 output,您必須研究編譯器生成的程序集。 最終要了解編譯器為何生成此程序集,您需要研究編譯器的實現細節。 但是,如果您想了解 C++,那么這些都是徒勞的,您需要知道的是您的代碼具有未定義的行為。

我測試了這個程序,它崩潰了

暫無
暫無

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

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