std::map::find
接受const key_type&
作为参数。这样它就要求参数可以转换为key_type
。这似乎是对我的疏忽,因为论证不一定是可兑换到key_type
,它只需可比较。
我可以通过定义两个operator<
重载来使任意类型具有可比性:
struct A;
bool operator<(const key_type&, const A&);
bool operator<(const A&, const key_type&);
map::find
本身应该是一个模板。但事实并非如此。所以现在我已经完成了抱怨我可以问实际的问题:有没有办法轻松解决这个问题并在map
键之间搜索可比较但不可转换的值?
我的理解是我可以使用std::find_if
,但这是线性搜索而不是二分搜索(O(n)
而不是O(Log(N))
)。当然,我不想手工实现二进制搜索。
答案 0 :(得分:2)
从C ++ 14开始,map::find
实际上是一个模板,并且完全按照您的意愿工作(至少在满足下面描述的给定Compare::is_transparent
条件时)。
来自cppreference:
std :: map :: find
C ++ Containers库std :: map
iterator find(const Key& key )
; (1)
const_iterator find( const Key& key ) const
; (2)
template< class K > iterator find( const K& x )
; (3)(自 C ++ 14)
template< class K > const_iterator find( const K& x ) const
; (4)(自C ++ 14起)1,2)查找一个元素,其键等价于key。
3,4)查找一个带有键的元素,该元素与值相当 X。如果这个重载只参与重载解析 qualified-is Compare :: is_transparent有效并表示类型。它 允许调用此函数而不构造Key
的实例