删除算法意外行为

时间:2018-02-16 16:57:46

标签: c++ algorithm

任何人都可以解释std :: remove算法的以下行为(我觉得这很不寻常):

这是一个用来演示问题的小程序

std::vector<int> Vec;

Vec.push_back(3);
Vec.push_back(7);
Vec.push_back(9);
Vec.push_back(6);
Vec.push_back(1);
Vec.push_back(6);
Vec.push_back(2);

std::vector<int>::iterator iter;

std::remove(Vec.begin(), Vec.end(), 6);

for (int i : Vec)
{
    std::cout << i;
}

现在这是http://www.cplusplus.com/reference/algorithm/remove/

的排泄物

“....删除是通过将下一个不匹配的元素替换为val的元素来完成的,并通过将迭代器返回到应该被视为其的元素来发出缩短范围的新大小。新的过去的元素。“

elementS,如复数形式。

现在,我明白基本想法是什么 - 我不是要求你解释。该算法应该找到与作为第三个参数传递的值进行比较的所有元素等于true,将它们全部放入容器的后面并将迭代器返回到容器的新逻辑端 - 序列的开始处已删除“已删除”元素。据我所知,下次迭代容器时,应该忽略该序列中的元素。

我不明白的是,我在这里作为一个例子使用的程序有如下输出:

3 7 9 1 2 6 2

对我来说更特别的事实是,如果你在结尾的第二个6和第二个之间添加另一个值不是6的条目,则输出不再包含6。

现在,我知道可以使用成员erase / std :: remove组合从一个范围中删除多个元素。我在这段代码上试了一下(令我惊讶的是,考虑到上下文)它会产生你期望的结果。

所以,我不是要求从容器中删除多个相同值的出现的方法,我问是否有人能够解释这个算法引起的世界是什么?

0 个答案:

没有答案