您的刪除代碼不正確。刪除擦除成語看起來像這樣:
vector<int>::iterator it = remove(v.begin(), v.end(), 5);
v.erase(it, v.end());
在這種情況下,它具有擦除等於5的所有值的效果,但是它最小化拷貝以實現所需的量。
您的查找 - 刪除代碼只會刪除第一個等於5的值,因此它會按照您的要求進行操作。
刪除代碼將所有不等於5的值移動到向量的前面(這就是std::remove
的作用),擦除向量的剩餘元素之一,並在其後留下任何其餘元素,其中包含未指定的值(這也是remove
所做的)。如果矢量首先不包含5
,則它具有未定義的行爲,因爲在這種情況下,remove
將返回v.end()
。
因此,如果您只想擦除幾個等於5的單個元素,那麼std::remove
對您沒有用處,因爲它不保留(其他)5。如果你想在非5值開始和5個值移動到結束,去除第一的5S之前,那麼你實際上可以做到這一點與std::partition
只是不能與std::remove
:
auto it = partition(v.begin(), v.end(), [](int i) { return i != 5; });
if (it != v.end()) v.erase(it);
雖然,因爲一個5作爲另一個您刪除了最後的5秒,而不是第一個獲得相同的結果,而且它的效率更高,當有超過其中一個是好的:
auto it = partition(v.begin(), v.end(), [](int i) { return i != 5; });
if (it != v.end()) v.pop_back();
如果你能以某種方式確保矢量最初包含正好一個元素等於5(沒有更多或更少s),那麼你的兩個代碼就會做同樣的事情。在這種情況下,您不需要在查找 - 清除代碼中對it != v.end()
進行測試,您會知道它不相同。你可以做v.erase(find(v.begin(), v.end(), 5))
。
[我在這裏做了兩個評論,但他們都錯了,請忽略:-)] –
更好的答案在這裏提供:https://stackoverflow.com/questions/24011627/erasing-using-iterator-from-查找或刪除 – giuseppe