我对std :: remove算法的使用之间的区别感到有点困惑.具体来说,我无法理解使用此算法时要删除的内容.我写了一个像这样的小测试代码:
std::vector<int> a;
a.push_back(1);
a.push_back(2);
std::remove(a.begin(), a.end(), 1);
int s = a.size();
std::vector<int>::iterator iter = a.begin();
std::vector<int>::iterator endIter = a.end();
std::cout<<"Using iter...\n";
for(; iter != endIter; ++iter)
{
std::cout<<*iter<<"\n";
}
std::cout<<"Using size...\n";
for(int i = 0; i < a.size(); ++i)
{
std::cout<<a[i]<<"\n";
}
Run Code Online (Sandbox Code Playgroud)
两种情况下的输出均为2,2.
但是,如果我使用erase删除这样的东西:
a.erase(std::remove(a.begin(), a.end(), 1), a.end());
Run Code Online (Sandbox Code Playgroud)
我得到输出为2.
所以我的问题是:
(1).有没有使用std :: remove而不是使用擦除功能.
(2).即使在执行std :: remove之后,为什么a.size()返回2而不是1?
我在Scott Meyer的Effective STL书中读到了关于擦除删除习语的内容.但我仍然有这种困惑.