在對“使用 end()-- 的 std::vector 最后一個元素的迭代器”的公認答案中, @barry 指出:
請注意,如果 vector::iterator 只是 T* (這將是有效的),則上面的第一種形式是格式錯誤的。后兩者不管用,所以更可取。
參考他的代碼:
std::vector<int>::iterator it = --container.end();
std::vector<int>::iterator it = container.end() - 1;
std::vector<int>::iterator it = std::prev(container.end());
該意見在評論中存在爭議,但沒有明確的解決方案。所以這就是我的問題:第一個和第二個之間的語意差異到底是什么?對于除 之外的結構的迭代器,答案是否會有所不同vector?
uj5u.com熱心網友回復:
對于任何標準庫容器,成員函式end()回傳一個 r 值。在將其分配給變數之前,它是“臨時的”。
減量運算子--不需要在 r 值迭代器上作業。您將修改臨時檔案,C 歷史上已采取措施避免這種情況。
因此,--container.end() 可能會在符合標準的 C 編譯器上進行編譯。但它可能不會。
std::prev(container.end())將適用于每個符合標準的編譯器。
回顧:
--container.end()可能無法編譯。這取決于實施。container.end() - 1僅當容器使用隨機訪問迭代器時才會編譯。std::prev(container.end())將始終編譯。
如果它們編譯,所有三種形式都將產生相同的結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/315012.html
上一篇:函式作用域和指標
