我有这个数据结构:
class foo {
class bar key;
… some_associated_values …
};
我现在想要使用它构建一个unordered_set / map /。我的问题是C ++ 14不支持单独使用密钥来查找集合的成员,因此unordered_set不存在。使用map需要拆分值类,或者复制键,但两者都需要对我现有的代码库进行一些侵入性的重构。
像这样的映射的理想数据结构似乎是std::pair<const class key&, class value>
(用引用替换值类中的键也可以) - 但是我如何初始化它,最好是以可移植的方式?
答案 0 :(得分:2)
我的问题是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 );
}
(P.S。possible使用unordered_map
制作一些内容,但它很卑鄙且容易出错。)