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更熟.
总结以上是内存溢出为你收集整理的c – 在这种情况下我应该使用算法还是手工编写代码?全部内容,希望文章能够帮你解决c – 在这种情况下我应该使用算法还是手工编写代码?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)