[英]Removing elements from the end of a vector in C++ using iterator
我想以相反的順序從向量中刪除元素,從最后一個元素開始。 據我所知,使用迭代器執行此操作的最簡單方法是:
std::vector<int> data = ...
std::vector<int>::iterator iter;
for(iter = data.end() - 1; iter != data.begin() - 1; iter--) {
data.erase(iter);
}
我的問題是,這些erase()調用中的每一個都是O(1),因為我們最后會刪除,即使刪除的一般復雜性是O(n)? 此外,假設向量至少有1個元素,此代碼是否“安全”?
不,你的算法有UB。 如果沒有,它將有O(n)。
將正文更改為此將刪除UB: iter = data.erase(iter);
為什么? 因為vector.erase()
行為如下:
如果你像這樣重寫循環,它甚至可以用於空容器:
for(auto it = data.end(); it!=data.begin(); it = data.erase(it-1)) /**/;
它等於:
std::remove_if(data.rbegin(), data.rend(), [](data::reference x){return true;});
無論如何,使用data.clear()
, data.resize(0)
或使用臨時空向量進行交換很可能會更快。
除非你真的需要以相反的順序刪除它們,否則你最好只需調用data.clear()
。
否則,不,這不是“安全”:形成data.begin() - 1
是不確定的,和遞減iter
你叫后.erase
它也是不確定的。 Deduplicator已經發布了一個很好的解決方案。
均田。 std :: vector erase()的復雜性是
刪除的元素數量(destructions)加上最后一個元素刪除(移動)后的元素數量。
基於此來源: http : //www.cplusplus.com/reference/vector/vector/erase/
當你只刪除一個元素及其最后一個元素時,它的線性與N = 1,可以解釋為O(1)constantish。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.