当前位置:  开发笔记 > 编程语言 > 正文

在这种情况下,我应该使用算法还是手工编码?

如何解决《在这种情况下,我应该使用算法还是手工编码?》经验,为你挑选了2个好方法。

好的,有人告诉我哪个更好.我需要| =一个向量的元素与另一个向量.也就是说,我想

void orTogether(vector& v1, const vector& v2)
{
    typedef vector::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& v1, const vector& v2)
{
    transform(v1.begin(), v1.end(), v2.begin(), 
        v1.begin(), BitwiseOr());
}

这是一个更有效的解决方案,即使最上面的一个到位,但底部是分配?这是在处理循环的中间,我需要尽可能快的代码.

编辑:为BitwiseOr添加(明显?)代码.另外,我收到很多关于非相关事情的评论,例如检查v2的长度和更改名称.这只是一个例子,真正的代码更复杂.

好吧,我描述了两个.orTogether2比orTo快得多,所以我将使用transform方法.我很惊讶,或者在MSVC9发布模式下,总共2倍快了4倍.我跑了两次,第二次更改顺序,以确保它不是某种缓存问题,但结果相同.感谢大家的帮助.



1> SPWorley..:

最底层的将编译为与第一个有效相同,您的OR仿函数将被确保内联.因此,如果您需要添加更多灵活性或调试框架或其他任何内容,第二个习语会更灵活.

由于第一个没有任何好处,请使用transform方法.一旦你养成这种习惯,你就会停止考虑所有应用程序的显式循环选择,因为它是不必要的.第一种方法的唯一优点是更容易向初学者C++程序员解释,他们对原始C更熟.



2> Robert Gould..:

抓住你的手表并测量

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有