簡體   English   中英

帶有過去的迭代器的std :: iter_swap是否不好?

[英]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. 1現在在哪里?
  2. 0是從哪里來的? 它是end()迭代器的表示嗎? 我想它也可能是具有默認構造的int的默認值?
  3. 是這種不確定的行為,還是通常以其他方式躲避? 我需要采取預防措施來防止這樣做嗎?
  4. 此實現具體嗎? 這適用於所有迭代器還是僅適用於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.

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