map :: find的类型可比,但不能转换为key_type

时间:2016-06-28 10:15:26

标签: c++ c++11 dictionary

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)))。当然,我不想手工实现二进制搜索。

1 个答案:

答案 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

的实例