我想弄清楚從std :: set中清除多個元素的複雜性。我正在使用this page作爲源。它聲稱使用迭代器擦除單個項目的複雜度爲O(1),但使用範圍形式擦除多個項目爲log(c.size())+ std :: distance(first,last )(即 - 集合的大小的日誌+刪除的元素的數量)。如果要擦除的元素的數量(n)遠遠小於集合(m)中的元素的數量,則這意味着循環遍歷待擦除的元素並擦除它們中的一個(O(n))比用一個呼叫擦除它們更快(O(log m),假設n爲< < m)。std :: set擦除複雜性異常?
很明顯,如果真的如此,第二種形式的內部實現只會執行上述循環。
這是該網站的錯誤?規格中的錯誤?我只是想念一些東西?
感謝, Shachar
_erasing使用範圍形式的多個項目是log(c.size())+的std ::距離(第一,最後)(即 - 日誌中的集合的大小+元素的刪除數的)。 _ - 固定集合的大小與O(n)完全相同,其中n是被刪除的元素數量,這是您逐個刪除元素的數量。 – Cthulhu
這很有趣,我想你可以用兩種方法來測試它,看看差異。也許在每次擦除之後重置迭代器會有一些開銷(因爲我認爲這會使迭代器失效) –
@Cthulhu,只要在複雜度中使用加號,就會應用相同的邏輯。任何你假設不變(或甚至有界)的東西都會自動複雜爲O(1)。 –