使用过去的迭代器对std :: iter_swap不好吗?

sim*_*nwo -1 c++ stl

我一直在使用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;
}
Run Code Online (Sandbox Code Playgroud)

此代码编译并运行正常.

Before: 1
After:  0
Run Code Online (Sandbox Code Playgroud)

很明显,1已经在某处交换了,但这看起来有点奇怪.

  1. 1现在在哪里?
  2. 哪里有0从何而来?它是end()迭代器的表示吗?我想它也可能是int默认构造的默认值?
  3. 这种不确定的行为,或者通常以其他方式狡猾吗?我是否需要采取预防措施以防止这样做?
  4. 这个实现是否具体?这适用于所有迭代器还是仅适用于vector

Fre*_*abe 5

是的,这很糟糕.iter_swat需要取消引用两个迭代器,但是你可能不会取消引用返回的迭代器end().