2011-04-26 38 views

回答

13

有一個明顯的原因:這樣的構造函數是什麼樣的?

所有的序列容器都有一個可以用一個整數參數調用的構造函數。該構造函數將容器的大小調整爲具有指定數量的元素。

是的,您可以添加第二個參數(如bool reserve_instead_of_resize),以便能夠將此構造函數用於初始大小調整和初始保留,但是我認爲最終結果會令人困惑。

+0

它可以採取另一種,對於保留的大小不同的整數參數 - 除了將與衝突在「T = size_t」的情況下,初始值的不同'const T&'參數(並且在其他情況下可以與另一個可轉換的情況下混淆)。 – 2011-04-26 15:42:39

+1

是的。還有一致性的問題:保留只對向量有意義,所以我們最終會爲vector創建另一個構造函數。我認爲所有的(或大多數)其他構造函數都可用於所有的序列容器(儘管字符串確實有一些額外的構造函數,但它也不是泛型容器)。對於它的價值,我很少使用儲備。作爲一種優化,它有時是有用的,但我認爲,不足以保證另一個構造函數。 – 2011-04-26 15:53:51

+2

我很偶爾使用'reserve'不是作爲優化,而是爲了防止重新分配的語義效應 - 迭代器和指針失效以及異常的可能性。我同意這不是真的值得一個構造函數,或者更確切地說是現有構造函數的一組重複項。在最糟糕的情況下,我認爲你想用不重要的內容來構建並保留,而且你害怕重新分配的成本。所以你需要構造空的,然後保留,然後插入內容。 – 2011-04-26 16:01:44

10

你可以簡單地做一個函數用於創建一個保留的向量:

// make_reserved_vector 
template <typename... T> 
std::vector<T...> make_reserved_vector(size_t n) { 
    std::vector<T...> vec; 
    vec.reserve(n); 
    return vec; 
} 

和使用:

auto myvec = make_reserved_vector<int>(32768); 
+4

這是一個好主意。這解決了這個問題,但是C++庫仍然有一個固有的問題:你可能不得不支付兩個內存分配(第一個向量構造函數,當你不知道默認容量是什麼時),然後第二個(當你預留和可能的釋放和重新分配)。您的解決方案充分利用了這一點,但我認爲C++委員會需要重新審視這個問題。 – rts1 2016-04-01 17:52:11

+0

@ rts1:的確,這也是我的擔憂。可能會有一個'默認尺寸儲備',然後我們打電話給另一個儲備。可能有多個構造函數,一個取大小。 – 2016-08-21 17:07:15

+1

相當古老的q/a,但在某處我必須釋放我的沮喪;)我不明白爲什麼在初始容量和初始大小之間進行選擇時,他們會選擇大小。如果我們可以選擇初始容量,那麼施工後可以更改尺寸而無需額外費用。就像現在一樣,我要麼需要一個可能不需要或者可能支付兩次以獲得我想要的容量的大小的矢量。 Imho反對C++的第一原則,不支付你不需要的東西。無論如何,你的函數可能是處理它的最好方法 – user463035818 2017-04-12 11:34:21

0

要創建載體,並在同一時間,指定其容量,創建具有所需容量的矢量,將其複製到您想要的元素中,並從通過複製返回的迭代器中擦除。 如果構造函數很慢,只需使用只保留內存的特殊參數編寫另一個構造函數即可。

int main (int argc, char** argv) { 
    std::vector<size_t> v (10, 0); 
    size_t tmp [3] = {0, 1, 2}; 
    std::vector<size_t>::iterator i (v.begin()); 
    i = std::copy ((const size_t*)tmp, (const size_t*) &tmp [3], v.begin()); 
    v.erase (i, v.end()); 
    std::cout << "\tv capacity == " << v.capacity() << std::endl; 
} 

將輸出:

V容量== 10

+0

如果元素的構造函數有副作用(或者只是慢),那麼這與創建一個空向量然後保留一些容量有不同的行爲。 – 2017-02-21 10:25:17

+0

如果控制器速度很慢,請在您的類中創建一個只保留內存的foo構造函數 – 2017-02-21 12:02:31

相關問題