如果下面的代码是未定义的行为,我正在尝试获取信息,我确实在这里阅读过。
特别是我想确保迭代器变量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应该指向什么?
是的,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"您在看到数字示例时可能期望的结果。
| 归档时间: |
|
| 查看次数: |
93 次 |
| 最近记录: |