我想创建一个已知大小的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)。 –