2014-11-04 50 views
1

我跑进其中i需要删除向量的最后一个元素,直到一定的条件被满足的一个问题(在这个例子起见让它成为元素不是零)除去矢量最后元素,直到条件

我写了这个代码,它的伎俩 -

auto next = vec.rbegin(); 
while (next != vec.rend()) 
{ 
    auto current = next++; 
    if (*current == 0) 
     vec.pop_back(); 
    else 
     break; 
} 

但我宁愿发现,我可以使用(我可以使用find_if然后删除一个STL算法,但我想循环一次通过我删除的元素...)

另外,恐怕我可能在这里调用一些UB,我应该担心吗?

+0

看一看的[擦除remove惯用法](http://en.wikipedia.org/wiki/Erase- remove_idiom)。 – juanchopanza 2014-11-04 20:21:11

+1

你写的循环将删除最后的'n'元素,其中'n'是整个向量中的0的数量,而不是末尾的0的数量。那是你的意思吗? – 2014-11-04 20:22:23

+0

@MarkB,谢谢,我忘了else语句。 – user1708860 2014-11-04 20:25:26

回答

5

你的代码可以simplier:

while(!vec.empty() && vec.back() == 0) 
    vec.pop_back(); 

使用std::removestd::remove_if将消除由基于标准的所有元素,所以你应该使用std::find_if作为弗拉德在他的回答中提供。

+0

你确定他们不能使用反向迭代器吗? – 2014-11-04 20:31:02

+1

@NeilKirk很好的问题。有关find_first_of的文档需要ForwardIterator,但不清楚reverse_iterator是否满足该要求,这很奇怪(基于名称) – Slava 2014-11-04 20:38:23

+0

这确实缩短了我的代码,谢谢。我仍然在寻找一些stl算法解决方案,所以我会等一下,如果什么都没有显示出来,我会批准这个答案... – user1708860 2014-11-04 20:43:23

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 
+0

怎么样1 2 3 4 0 5? – Slava 2014-11-04 20:39:33

+0

@Slava这里零不是最后一个元素。所以这个顺序不能改变。 – 2014-11-04 20:40:18

+0

是的,我看到它,你发现第一个元素,从末尾不等于0。好主意。 – Slava 2014-11-04 20:51:46