簡體   English   中英

你能截斷 std::vector<int> 在恆定的時間?</int>

[英]Can you truncate std::vector<int> in constant time?

有幾種方法可以使向量為空,包括

std::vector<int> example = makeMyReallyBigVector();
example.clear();
example.resize(0);
example.erase(example::being(), example::end());
// any other method which would be relevant

C++ 標准中是否有關於哪個最有效、時間最明智的保證? 內容是沒有析構函數的原始數據類型。 我特別關心的是,我不希望向量容量發生變化,我只希望它的內部“已用大小”設置為 0,而不觸及現在已刪除的內容。

我想要的是在恆定時間內將int向量大小設置為 0,而不釋放任何 memory。C++ 標准是否可行?

如果 C++ 標准不提供任何保證,我正在使用 GNU C++ 標准庫,那么如果標准不提供任何保證? 為了便於攜帶,在這種情況下,當然也會對有關 Clang 和 Microsoft 標准庫的信息感興趣。

example.clear();

clear的是:

與容器的大小成線性關系,即元素的數量。

example.resize(0);

resize

當前大小和計數之間的差異呈線性。 如果容量小於計數,則重新分配可能會導致額外的復雜性

example.erase(example::begin(), example::end());

erase

線性:調用T的析構函數的次數與被擦除的元素個數相同,T的賦值運算符被調用的次數等於vector中被擦除元素之后的元素個數

我不確定為什么clearresize都沒有提到對析構函數的依賴。 int只有一個偽析構函數(使對int有效調用析構函數的東西,但它什么都不做)。

如果元素確實具有析構函數,則復雜性是線性的。 對於int ,編譯器可能足夠聰明,可以在恆定時間內完成。 當您不確定運行時間時,您可以分析運行情況,或直接閱讀反匯編代碼。

example.clear(); 可能會更快。 以上所有示例都采用 arguments,這意味着將生成額外的代碼將它們傳遞給需要執行的 function。

但是,重要的是要記住 C++ 編譯器非常聰明,可能能夠將example.resize(0); 進入example.clear(); . 但事實並非如此。 因此,如果不困難,最好幫助編譯器。

暫無
暫無

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

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