int main() {
std::vector<bool> v(10, false);
v[0] = true;
v[1] = true;
auto end_it = remove(v.begin(), v.end(), true);
for (int i = 0; i < v.size(); ++i) cout << v[i] << endl;
}
从擦除和删除/删除_if算法之间的差异?,我的理解是
v
中的所有元素true
将被转移到v
的末尾,但是当我打印上面的内容时,它会打印所有false
,所以看来我对链接答案的解释不正确。
从
end_it
到 v.end()
发生的事情是定义的行为吗?
您在帖子中遗漏的关键是
和remove
仅按顺序移动对象remove_if
强调我的
move 是字面意思,
remove
和 remove_if
使用移动操作来更改顺序,并且在将对象移出后,该对象将保持有效但未指定的状态。这意味着返回的迭代器之后的所有元素都有一个未指定的值以及所有通常需要的包袱。