我想创建一个已知大小的std::vector<int>
并立即用一些生成的值填充它。有没有办法做到这一点,没有(1)首先将矢量零填充到所需的大小或(2)在每个元素上使用reserve
然后push_back
?
例如,要使用值{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
的机制,实际上编译得很差。
在有人跳入并说“编译器很聪明之前,他们会为你优化这个!” - -O2
上有关前沿编译器的check out the generated assembly。这是非常可怕的,push_back
变种在糟糕的情况下消失了 1 。
1 有趣的是,糟糕的push_back
版本仍然可以获得非常大的向量,因为您主要受内存带宽的限制,以及方法1的零填充方法占用带宽的2倍。 push_back
方法至少只在值上循环一次,但使用慢循环。
答案 0 :(得分:3)
你可以: