![](/img/trans.png)
[英]Advance iterator for the std::vector std::advance VS operator +?
[英]std::advance of std::multimap end() iterator by negative number crashes
我的應用在執行此操作時崩潰:
std::multimap<int, std::string, std::greater<int>> mm;
// insert elements
auto it = mm.end();
std::advance(it, -(mm.size() - 7));
這是當機的訊息:
Expression: map/set iterator not incrementable
問題是什么?
編輯:當我只寫-1而不是-(mm.size() - 7)
它沒有崩潰,為什么? 請考慮當我調試mm.size()為8時。
編輯2:當我寫std::advance(it, -(static_cast<int>(scoresMap.size()) - 7));
有用。 這是因為多圖的大小類型,但仍然無法猜測是什么原因。
(mm.size() - 7)
產生一個無符號值std :: size_t。 然后,根據最近的C ++規范草案(N3690),將無符號值取反:
一元運算符的操作數應具有算術或無作用域的枚舉類型,其結果是其操作數的取反。 積分提升是對整數或枚舉操作數執行的。 無符號數量的負數是通過從2 n中減去其值來計算的,其中n是提升操作數中的位數。 結果的類型是提升操作數的類型。
由於無符號類型的取反規則,提供給std::advance
值可以轉換為大於mm.size()
某個值。
編輯中的第二個表達式static_cast<int>(scoresMap.size() - 7)
將值更改為帶符號類型int。 取反該值將獲得所需的值,但是,如果scoresMap.size() - 7
返回的值大於std::numeric_limits<int>::max()
,則static_cast
具有未定義的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.