2017-03-16 75 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)。 –

回答