わかりました、誰かが私にどちらが良いか教えてください。あるベクトルの要素を別のベクトルで |= する必要があります。つまり、したい
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 は orTogether よりもはるかに高速なので、transform メソッドを使用します。驚いたのは、orTogether2 は MSVC9 リリース モードで約 4 倍高速でした。2 回実行し、2 回目は順序を変更して、ある種のキャッシュの問題ではなく、同じ結果であることを確認しました。みんな助けてくれてありがとう。