std::reference_wrapper
は、それが保持するタイプへの参照に暗黙的に変換可能であるため、MyClass
に1を割り当てることができます。あなたが本当に割り当てる必要がある場合
std::vector<MyClass> v(begin(rv), end(rv));
または、:: だから他に1を初期化するためのより良い方法は、適切なベクターコンストラクタです
v.assign(begin(rv), end(rv));
あなたはstd::mismatch
アルゴリズムを適用することによって、比較を行うことができます、再びstd::reference_wrapper
が提供する暗黙的な変換のおかげで:親指の一般的なルールとして
bool is_same(std::vector<MyClass> const& v, std::vector<std::reference_wrapper<MyClass>> const& rv) {
return v.size() == rv.size() &&
end(v) == std::mismatch(begin(v), end(v), begin(rv), end(rv)).first;
}
は、それはですあなた自身でループを書く前に、標準のアルゴリズムライブラリを参照するのは良いことです。これは、動詞と名詞を計算ステップに与えることによって、あなた自身のコードをより読みやすくします。標準ライブラリが提供できる最適化を可能にする利点があります。が指摘
cppleaner として、私は自分自身をより密接にライブラリを相談している必要があります。
bool is_same(std::vector<MyClass>& v, std::vector<std::reference_wrapper<MyClass>>& rv) {
return std::equal(begin(v), end(v), begin(rv), end(rv),
[](const MyClass& c, const std::reference_wrapper<MyClass>& rc) {
return c == rc.get();
});
}
代わりに、カスタム書くことができます:
class MyClass {
bool operator ==(const MyClass&);
};
bool operator != (const MyClass&, const MyClass&);
bool operator == (const MyClass&, const std::reference_wrapper<MyClass>&);
bool operator == (const std::reference_wrapper<MyClass>&, const MyClass&);
bool operator != (const MyClass&, const std::reference_wrapper<MyClass>&);
bool operator != (const std::reference_wrapper<MyClass>&, const MyClass&);
およびクライアントコード(このis_same
はstd::equal
return std::equal(begin(v), end(v), begin(rv), end(rv));
v.size()== rv.size()&&ではなく 'std :: equal(begin(v)、end(v)、begin(rv)、end(rv))' end(v)== std :: mismatch(begin(v)、end(v)、begin(rv)、end(rv))。 'std :: equal'だけでなく、各反復で1つの反復子の比較を保存します。 – cpplearner
@cpplearner - ありがとう。私はコーヒーを飲む前にこの答えを書いてはいけません。 – StoryTeller