为什么std :: map有一个find成员函数?

Kaz*_*gon 5 c++ stl stdmap

我和一位同事正在讨论成员与非成员职能的相对优点.出现了一个问题:为什么std::map会有find成员函数.

我的回答是,尽管您可以std::find在地图上使用,但您必须搜索键值对,或使用find_if和例如lambda.但是,这是线性的,并且map.find在线性时间内提供了按键搜索.我最后断言,如果它可能是一个非成员,那么它本来就是!(虽然,std :: string表明我的概括可能有些仓促).

我的同事指出,可以采用find与非成员函数相同的方式实现map.lower_bound.

是否有一个理由map.find已经制成的零件?

das*_*ght 8

实现作为非成员函数std::find搜索密钥的一个很大的反对意见std::map是,这样做会阻止您实现std::find搜索键值对的当前版本.

作为关联容器,std::map包含键值对.非成员std::find被定义为所有容器,作为在容器中搜索项目的函数,该项目必须是键值对std::map; 使用std::find按键查找项目会不一致.

显然,可以实现std::find_by_key仅适用于地图的功能,但是这样的功能总是具有基于地图类型的专门化.与添加成员函数相比,API设计没有改进.

  • @KazDragon:通用`std :: find`的第三个参数是独立推导出来的.这意味着对于`std :: map <std :: string,int>`,你会得到`find(...,"Foo")`和`find(...,"Foo"s)`的不同重载.只有后者才有用.前者选择泛型重载,即使有从`char [4]`到`std :: string`的转换. (2认同)