删除无法正常工作

Roo*_*kie 13 c++ algorithm templates stl c++11

std::vector<int> v = {1,2,3,4,5};
auto i = std::remove(v.begin(),v.end(),3); 
for(auto j = v.begin(); j!= v.end();++j)
   std::cout << *j;
Run Code Online (Sandbox Code Playgroud)

实际产量: 12455

额外的5来自哪里?

期望的输出: 1245

如何实现相同?

我实际上想要改变矢量的大小,Prasoon saurav给出的答案看起来是正确的

Pra*_*rav 25

remove 实际上并没有删除元素

删除从范围中移除[first, last)所有等于的元素value.也就是说,remove返回一个迭代器new_last,使得该范围[first, new_last)不包含等于的元素value.1范围内的迭代器[new_last, last)仍然提领,但它们指向的元素是未指定的.删除是稳定的,这意味着不等于值的元素的相对顺序不变

std::remove 算法只使用一对前向迭代器,并且通常对底层容器一无所知.

你需要使用erase-remove成语来实际删除元素,即结合erase使用remove

auto i = std::remove(v.begin(),v.end(),3);
v.erase(i,v.end());
for(auto j = v.begin(); j!= v.end();++j)
   std::cout << *j;
Run Code Online (Sandbox Code Playgroud)

  • @Rookie:再次查看`remove()`调用.该算法看到一个序列并且无法访问容器,那么它怎么能从中移除任何东西呢? (4认同)
  • "擦除 - 删除成语" - 在页面末尾的"注释"中给出. (2认同)
  • @GMan:我的意思是赞成你的回答并删除我的上述评论.你为什么删除你的答案?它包含了Prasoon尚未制作的重要一点. (2认同)
  • @David:但区别很重要,我同意@sbi认为OP应该知道它.我会说,任何能够让人们更好地理解他们正在使用的图书馆的东西都是好事. (2认同)

Vic*_*let 5

std::remove再次阅读文档.

该函数不会从容器中删除元素(事实上,它甚至不知道涉及容器,因为它只看到迭代器),它只是在序列中移动值并返回一个新的迭代器i,使得所有间隔[ begin .. i [ 包含原始订单中的所有未删除元素.遗留下来的元素[ i .. end [是未指定的,您有责任从容器中消除该间隔(如果需要):

auto i = std::remove(...);
v.erase(i,v.end());
Run Code Online (Sandbox Code Playgroud)

你有一个额外的原因5是典型的删除算法将值复制到被删除的值留下的空洞中,并且由于i迭代器之后的值永远不会被覆盖,因此它们与原始序列中的值保持一致.但是,这种行为并不可靠 - 只需消除过去的值i而不读取它们.