在同一个容器中移动元素

met*_*ter 6 c++ stl

如果下面的代码是未定义的行为,我正在尝试获取信息,我确实在这里阅读过。

特别是我想确保迭代器变量iter在移动元素与目标范围重叠的情况下有效。

我认为这不好但无法确认,有什么更好的方法可以做到这一点?

#include <vector>
#include <iostream>

int main()
{
    // move 3, 4 closer to beginning
    std::vector<int> vec { 1, 2, 3, 4, 5, 6, 7 };
    auto iter = std::move(vec.begin() + 2, vec.end() - 3, vec.begin() + 1);
    std::cout << *iter << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

也没有提到 thisiter应该指向什么?

son*_*yao 5

是的,std::move在这种情况下使用它是格式良好的。

(强调我的)

移动重叠范围时,std::move适合向左移动(目标范围的起点在源范围之外),std::move_backward适合向右移动(目标范围的终点在源范围之外)。

关于返回值,

将迭代器输出到最后移动的元素之后的元素 (d_first + (last - first))

soiter指向最后移动的元素之后的元素,即

// elements of vec (after moved)
// 1, 3, 4, x, 5, 6, 7
// here     ^
Run Code Online (Sandbox Code Playgroud)

注意

在此操作之后,移动范围内的元素仍将包含适当类型的有效值,但不一定与移动前的值相同。

在这里,x是这样一个未指定的值。这可能会碰巧是 another 4,但这不应该被依赖。细微的变化,例如字符串向量而不是数字,可能会导致不同的行为。例如,对上的相同操作{ "one", "two", "three", "four", "five", "six", "seven" }可能会导致它"two"而不是"four"您在看到数字示例时可能期望的结果。