[英]Is it bad to std::iter_swap with a past-the-end iterator?
我一直在使用std::iter_swap
交換兩個迭代器引用的元素。 我一直想知道,如果迭代器之一是過去的迭代器(例如end()
返回),它將產生什么影響。
例如:
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
vector<int> is = { 1 };
cout << "Before: " << is.at(0) << endl;
iter_swap(is.begin(), is.end());
cout << "After: " << is.at(0) << endl;
return 0;
}
Before: 1
After: 0
顯然, 1
已被交換到某處,但這似乎有些奇怪。
1
現在在哪里? 0
是從哪里來的? 它是end()
迭代器的表示嗎? 我想它也可能是具有默認構造的int
的默認值? vector
? 是的,這很糟糕。 iter_swat
需要取消引用兩個迭代器,但是您可以不取消引用由end()
返回的迭代器。
從25.3.3 25.3.3 swap
(alg.swap)開始, iter_swap
的效果是
效果:swap(* a,* b)。
要求:a和b必須是可取消引用的。 * a應可與(17.6.3.2)* b互換。
由於它同時取消引用兩個迭代器,因此如果其中一個迭代器超過了容器,則可能無法取消引用它。
1現在在哪里?
可能過去了您的向量。 它可以位於或可以位於end_of_allocation之內。
0是從哪里來的? 它是end()迭代器的表示嗎? 我>猜是否也可能是具有默認構造的int的默認值?
它是一個未初始化的值,可能為1,也可能不是。此外,您可能還會觀察到內存訪問錯誤/崩潰。
是這種不確定的行為,還是通常以其他方式躲避? 我需要采取預防措施來防止這樣做嗎?
是的,是的。 切勿直接或間接訪問超出已分配塊的內存。
此實現具體嗎? 這適用於所有迭代器還是僅適用於向量? 不是,它不是特定於實現的。 未定義。 它適用於所有迭代器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.