2016-03-28 80 views
3

我需要擦除排序向量中的元素,同時抑制等於或大於n的複雜度。我知道vector . erase方法會消除它,但它的複雜性是n。我可以用最後一個元素重寫那個結構元素,然後使用回彈刪除最後一個應該是常量的方法,但問題是它不會保持排序,所以我不得不重新排序。它甚至有可能解決這個問題並保持低於n的複雜度?向量中擦除<n複雜度的元素

+0

不能做。或者a。)使用另一個數據結構b。)批量移除元素(參見擦除 - 刪除習慣用法)c。)將元素標記爲未使用 – milleniumbug

+0

將元素標記爲未使用對我來說不是正確的選項,它會吃掉大量內存。 – kvway

+0

在嘗試進行任何更改之前,請確保您**測量性能**。在現代硬件上,它往往需要令人驚訝的大的N來使向量的性能超過其他容器類型。 –

回答

3

既然你需要它排序,std::vector(據我所知)沒有解決方案。但是,std::vector似乎並不適合您的情況。 std::list是你的一個選擇(可能會更好)。

從該參考文獻:http://www.cplusplus.com/reference/list/list/erase/

複雜

線性在擦除元素的數量(破壞)。

這意味着它將調用析構函數N次,其中N是要刪除的項目數。所以,它是刪除項目的數量(不是std::list項目數量)線性關係

+1

感謝您的回答。 – kvway

3

如果您必須保持您的數據結構排序,並能夠從中間擦除元素(s)具有高性能,更好地用另一個容器替換vector(例如set,multiset)?

+0

使用set/multiset的@kvway可能是您需要的,因爲使用列表您可以訪問一個元素的O(n)成本。 – ead