【发布时间】:2016-12-12 10:28:17
【问题描述】:
我想对数组进行简单的扫描。我有一个std::vector<int> data,我想找到元素小于 9 的所有数组索引并将它们添加到结果向量中。我可以用一个分支来写这个:
for (int i = 0; i < data.size(); ++i)
if (data[i] < 9)
r.push_back(i);
这给出了正确答案,但我想将其与无分支版本进行比较。
使用原始数组 - 并假设 data 是一个 int 数组,length 是其中元素的数量,r 是一个有足够空间的结果数组 - 我可以这样写:
int current_write_point = 0;
for (int i = 0; i < length; ++i){
r[current_write_point] = i;
current_write_point += (data[i] < 9);
}
如何使用data 的向量获得类似的行为?
【问题讨论】:
-
data[i] < 9通常是汇编级别的分支(尽管与push_back相比,它肯定是一些cmov魔术的更好候选者,但肯定不是) -
第二个解决方案为什么比第一个更好?
-
我希望
current_write_point +=行生成与if (data[i] < 9) { current_write_point++; }相同的代码 -
@DimChtz 我想这就是他想要找出的——他想比较两种方法生成的代码。
-
您是否在分割点对
std::partition()和std::copy()进行了分析?
标签: c++ arrays vector conditional-statements