簡體   English   中英

使用迭代器從C ++中的向量末尾刪除元素

[英]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()行為如下:

  • 效果:在擦除點處或之后使迭代器和引用無效。
  • 復雜性:T的析構函數被稱為等於被擦除元素數量的次數,但T的移動賦值運算符被稱為等於擦除元素之后的向量中元素數量的次數。

如果你像這樣重寫循環,它甚至可以用於空容器:

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.

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