簡體   English   中英

為什么允許刪除vector.end()?

[英]Why erasing vector.end() is allowed?

今天,我做了一些代碼,看起來像這樣:

vec.erase(std::remove_if(vec.begin(), vec.end(), <lambda here>));

當上面的代碼不應該擦除任何東西時,意味着std :: remove_if應該返回vec.end(),當我收到大小減小了1的向量時,我感到非常驚訝:最后一個元素被擦除了。 問題已通過將上面的內容更改為:

vec.erase(std::remove_if(vec.begin(), vec.end(), <lambda here>), vec.end());

但是仍然存在一個問題:如何

vec.erase(vec.end());

有工作嗎? 不應該是不確定的行為嗎?

編輯:顯然,我從一開始就對未定義行為的理解是錯誤的,而且我一直觀察到的是UB。 謝謝大家回答我的問題。

不確定的行為。 特別是,這意味着您可能會看到尺寸減小了一個

有關UB的更多信息

為什么允許刪除vector.end()?

這是不允許的。 vector::erase(const_iterator)的參數必須是向量中有效的可解除引用的迭代器。 過去的迭代器有效,但不可取消引用。

怎么做? 不應該是不確定的行為嗎?

您為什么認為它無法工作並且行為不確定?

您認為未定義的行為意味着什么?

首先,不是

vec.erase(std::remove_if(<lambda here>), vec.end());

真的

vec.erase(std::remove_if(vec.begin(), vec.end(), <lambda here>), vec.end());

這完全不同於

vec.erase(vec.end());

后者vec.erase(vec.end())肯定是未定義的行為。 前者不是。

std::remove_if(vec.begin(), vec.end(), <lambda here>)

這將刪除向量中與lambda匹配的值,並且-最重要的是-這將返回新序列的結束值。

vec.erase(first, last);

這將刪除向量中從第first迭代器值開始, 直到但不包括 last迭代器值的值。

將兩者放在一起,就可以從向量中刪除匹配值,然后相應地縮小向量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM