我想創建一個已知大小的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
方法至少只循環一次,但使用慢循環。
評論不適用於擴展討論;這個談話已經[轉移到聊天](http://chat.stackoverflow.com/rooms/138407/discussion-on-question-by-beeonrope-efficiently-populate-vector-of-known-size)。 –