我遇到了一个问题,我需要删除向量的最后一个元素,直到满足某个条件为止(为了这个例子,让它成为元素不为零)
我写了这段代码,它就是诀窍 -
auto next = vec.rbegin();
while (next != vec.rend())
{
auto current = next++;
if (*current == 0)
vec.pop_back();
else
break;
}
但我更愿意找到一个我可以使用的stl算法(我可以使用find_if然后擦除,但我想通过我删除的元素循环一次。 。)
另外,我担心我可能会在这里调用一些UB,我应该担心吗?
答案 0 :(得分:5)
您的代码可以更简单:
while( !vec.empty() && vec.back() == 0 )
vec.pop_back();
使用std::remove
或std::remove_if
会根据条件删除所有元素,因此您应该使用std::find_if
作为Vlad在答案中提供的内容。
答案 1 :(得分:3)
这是一个例子。它使用一般习语来删除矢量
v.erase( std::remove( /*...*/ ), v.end() )
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
std::vector<int> v = { 1, 2, 3, 4, 5, 0, 0, 0 };
v.erase(
std::find_if( v.rbegin(), v.rend(),
[]( int x ) { return x != 0; } ).base(), v.end() );
for ( int x : v ) std::cout << x << ' ';
std::cout << std::endl;
return 0;
}
输出
1 2 3 4 5