加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:44:53 所属栏目:百科 来源:网络整理
导读:好的,有人告诉我哪个更好.我需要| =一个向量的元素与另一个向量.也就是说,我想 void orTogether(vectorchar v1,const vectorchar v2){ typedef vectorchar::iterator iter; for (iter i = v1.begin(),iter j = v2.begin() ; i != v1.end(); ++i,++j) *i |= *
好的,有人告诉我哪个更好.我需要| =一个向量的元素与另一个向量.也就是说,我想

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添加(明显?)代码.另外,我收到很多关于非相关事情的评论,例如检查v2的长度和更改名称.这只是一个例子,真正的代码更复杂.

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

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读