2014-11-04 23 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