我有一个
std::map<K, T, std::less<>>
和一个 KK
类型的“密钥”,它与 K
订单兼容。如果键存在,我想返回相应的值。如果该键不存在,我想具体化一个真实的键(类型为 K
),并将默认构造的 T
的键值对插入到映射中。
(我的问题针对的是C++14,但是借用C++17,你可以想到
K = std::string
和KK = std::string_view
,还有T = int
)。
似乎有两个次优解决方案: 这个:
auto it = insert(std::pair<KK, T>{ key, T{} }).first
不是最优的,因为即使不需要,它也需要具体化
T
值。
或者:
auto it = map.find(key);
if (it == map.end()) it = insert(std::pair<KK, T>{ K(key), T{} }).first;
由于双重查找而不是最优的。
透明映射不仅允许键被具体化,而且传递给
insert
的第二个(值)组件也不必完全是映射的 mapped_type
。您可以传递任何可转换为 mapped_type
的类型。这样,您就可以传递一个廉价的代理对象来按需创建值。