[英]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。 謝謝大家回答我的問題。
這是不確定的行為。 特別是,這意味着您可能會看到尺寸減小了一個
為什么允許刪除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.