【发布时间】:2010-10-17 15:15:08
【问题描述】:
好的,有人告诉我哪个更好。我需要 |= 一个向量的元素与另一个向量。也就是说,我想
void orTogether(vector<char>& v1, const vector<char>& v2)
{
typedef vector<char>::iterator iter;
for (iter i = v1.begin(), iter j = v2.begin() ; i != v1.end(); ++i, ++j)
*i |= *j;
}
由于需要处理 2 个集合,我无法使用 for_each。我想我可以做类似的事情
struct BitWiseOr
{
char operator()(const char& a, const char& b) {return a | b;}
};
void orTogether2(vector<char>& v1, const vector<char>& v2)
{
transform(v1.begin(), v1.end(), v2.begin(),
v1.begin(), BitwiseOr());
}
这是一个更有效的解决方案,即使顶部已经到位,但底部是分配?这正好在处理循环的中间,我需要尽可能快的代码。
编辑:为 BitwiseOr 添加(很明显?)代码。另外,我在不相关的事情上得到了很多 cmets,比如检查 v2 的长度和更改名称。这只是一个例子,实际代码更复杂。
好吧,我对两者都进行了介绍。 orTogether2 比 orTogether 快得多,所以我将使用 transform 方法。我很惊讶,orTogether2 在 MSVC9 发布模式下快了大约 4 倍。我运行了两次,第二次更改了顺序以确保它不是某种缓存问题,而是相同的结果。谢谢大家的帮助。
【问题讨论】:
-
这可能 99% 是不必要的,但检查 j != v2.end() 并不是世界上最糟糕的事情(实际上,我更喜欢 '>' 的模式而不是比'!=',但你明白了)
标签: c++ algorithm stl transform