2016-01-07 23 views
-1

我已經搜索瞭解決問題的方法,但未找到答案。以下代碼僅用於學習目的。我想刪除值爲3的所有元素在這個載體:如何在已排序的向量中找到值(C++)

std::vector<int> v{1,1,2,2,2,3,3,4,4}; 

我試圖解決這個問題是這樣的:

//只從代碼

iterator erase(T const& elem) { 
    return v.erase(std::remove(v.begin(), v.end(), elem), v.end()); 
} 

但在我摘錄測試用例,我希望迭代器指向值4,但在我的代碼中它指向值3.它只會從我的向量中移除前3個。

如何刪除兩個值「3」,以便迭代器返回指向4?

非常感謝您的幫助!

回答

2

雖然std::remove可以工作,但它沒有利用容器被分類的事實。爲此,您需要找到包含所有目標值的範圍。像這樣:

#include <algorithm> 
#include <vector> 

void remove(std::vector<int>& vec, int value) { 
    auto lb = std::lower_bound(vec.begin(), vec.end(), value); 
    auto ub = std::upper_bound(vec.begin(), vec.end(), value); 
    vec.erase(lb, ub); 
} 
+0

這是正確的版本 – fjardon

5

您的代碼按預期工作:

std::vector<int> v{1,1,2,2,2,3,3,4,4}; 

auto it = erase(3) 
assert(v == std::vector<int>({1,1,2,2,2,4,4}); 
assert(*it == 4); 

過去已刪除的最後一個元素返回的迭代點。

你簡直錯誤地解釋了vector::erase的返回值。

+0

[Demo](https://ideone.com/b3U2Nx) –

0

你做了一切正確。 請注意,返回的指針只是指向新的「結束」,因此您正在查看已釋放的內存。

如果你只是看向量v,你會發現所有'3's都被刪除了。