2017-03-16 33 views
1

我想創建一個已知大小的std::vector<int>,並立即用一些生成的值填充它。有沒有辦法做到這一點(1)首先將矢量零填充到所需的大小,或(2)在每個元素上使用reserve然後push_back高效地填充已知大小的矢量

例如,以填補值0雖然size-1載體:由冗餘零填充

// method 1 
vector<int> fill_resize(int s) { 
    vector<int> v(s); 
    for (int i = 0; i < s; i++) { 
    v[i] = i; 
    } 
    return v; 
} 

// method 2 
vector<int> fill_push_back(int s) { 
    vector<int> v; 
    v.reserve(s); 
    for (int i = 0; i < s; i++) { 
    v.push_back(i); 
    } 
    return v; 
} 

方法(1)浪費時間,和方法(2)需要在每一次插入,的push_back機械,其在實踐中彙編不佳。

之前有人跳進來說「編譯器很聰明,他們會爲你優化這個!」 - check out the generated assembly在前沿編譯器上-O2。這是非常可怕的,與push_back變種採取可怕的蛋糕。


有趣的是,這樁push_back版本仍然贏得了非常大的載體,因爲有你受內存帶寬大多限制,零則填充方法的方法1需要2倍的帶寬。 push_back方法至少只循環一次,但使用慢循環。

+0

評論不適用於擴展討論;這個談話已經[轉移到聊天](http://chat.stackoverflow.com/rooms/138407/discussion-on-question-by-beeonrope-efficiently-populate-vector-of-known-size)。 –

回答