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

Why does std::map have a find member function?

本文关键字:成员 函数 find map std 为什么      更新时间:2023-10-16

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

我的回答是,尽管可以在映射上使用std::find,但必须搜索键值对,或者使用find_if和lambda。然而,这是线性的,并且map.find在比线性时间更好的时间内提供按关键字搜索。我最后断言,如果它可能是一个非成员,那么它就会是!(不过,std::string表明我的概括可能有些草率(。

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

map.find成为会员有什么理由吗?

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

作为一个关联容器,std::map包含键值对。非成员std::find为所有容器定义为搜索容器中的项的函数,该项必须是std::map的键值对;使用CCD_ 14通过项的关键字来查找项将是不一致的。

显然,可以实现仅适用于映射的std::find_by_key函数,但这种函数总是基于映射的类型进行专门化。与添加成员函数相比,这在API设计中没有提供任何改进。

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

这将导致不同类型地图之间的不一致。例如,不能使用std::unordered_maplower_bound成员函数来实现自由函数find,因为没有这样的成员函数(与google::dense_hash_map等相同(。unordered_map的高效find需要访问类内部,并需要了解其实现细节。然后,map没有find成员函数,unordered_map有一个。这将使编写一个允许用户在不同类型的地图之间进行选择的通用代码变得困难,例如:

template <class map_type>
void (const map_type & map) {
// use std::find or map.find here ???

std::map有一个成员查找,因为map::operator[]map::at没有涵盖按键查找的所有用例。

operator[]要求mapped_typeDefaultConstructable,并在找不到映射时修改映射的大小。

如果at找不到,则抛出。

find没有operator[]的限制,如果找不到,既不修改也不抛出。