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
删除从范围中移除
[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)
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而不读取它们.
| 归档时间: |
|
| 查看次数: |
690 次 |
| 最近记录: |