私の問題は、C++ 14は、C++ 14あなたはstd::set
なくstd::unordered_set
を使用することができて
セットのメンバーを見つけるために、それ自体でキーを使用してサポートしていないということです( )順不同コンテナは異質のルックアップをサポートしていない理由は次のとおりです。
#include <set>
#include <assert.h>
struct bar { int i; };
bool operator<(const bar& l, const bar& r) { return l.i < r.i; }
struct foo
{
bar key;
int val;
};
struct cmp
{
using is_transparent = void;
bool operator()(const foo& l, const foo& r) const
{
return l.key < r.key;
}
bool operator()(const foo& l, const bar& r) const
{
return l.key < r;
}
bool operator()(const bar& l, const foo& r) const
{
return l < r.key;
}
};
int main()
{
std::set<foo, cmp> s;
s.insert(foo{{0}, 1});
s.insert(foo{{2}, 3});
auto pos = s.find(bar{0});
assert(pos != s.end());
assert(pos->key.i == 0);
assert(pos->val == 1);
pos = s.find(bar{1});
assert(pos == s.end());
pos = s.find(bar{2});
assert(pos != s.end());
assert(pos->key.i == 2);
assert(pos->val == 3);
}
(PSそれはを使って何かを作ることpossibleです210仕事ですが、悪いですし、エラーが発生しやすくなります)
unordered_set :: find()は完全な "foo"クラスで呼び出される必要があるため、この場合は役に立ちません。完全なコードはテンプレートを使用しています。私のコードは「クラスfoo」を初期化する方法を知らない(またはそれを気にする必要はない)。私はそれが空の初期化子を持つことを要求することはできません。 –
_ "C++ 14では、キー自体を使用してセットのメンバーを検索することはサポートされていません。" –
これは合法性とパフォーマンスの間で様々な程度の妥協を行うことができます。あなたは 'unique_ptr'を保存できますか? 'foo'に仮想' bar&get_key() 'を持たせることができますか? –