【发布时间】:2017-03-16 18:05:50
【问题描述】:
我想创建一个已知大小的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 变体在糟糕透顶1.
1有趣的是,糟糕的push_back 版本仍然会在非常大的向量中胜出,因为在那里你主要受内存带宽的限制,而方法 1 的零然后填充方法需要 2 倍带宽。 push_back 方法至少只对值循环一次,但使用的是慢循环。
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。
标签: c++ performance vector