代码之家  ›  专栏  ›  技术社区  ›  Kaz Dragon

为什么std::map有find member函数?

  •  5
  • Kaz Dragon  · 技术社区  · 6 年前

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

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

    我的同事指出 找到 与使用 map.lower_bound .

    是否有理由 地图查找 已经成为会员了吗?

    3 回复  |  直到 6 年前
        1
  •  8
  •   Sergey Kalinichenko    6 年前

    强烈反对实施 std::find 正在搜索上的密钥 std::map 作为一个非成员函数,这样做会阻止您实现 标准::查找 ,它搜索键值对。

    作为一个关联容器, 标准::地图 包含键值对。非成员 标准::查找 为所有容器定义为一个函数,用于搜索容器中的项,该项必须是 标准::地图 ;使用 标准::查找 按项的键查找项是不一致的。

    显然,我们可以 std::find_by_key 函数仅适用于映射,但此类函数始终具有基于映射类型的专门化。与添加成员函数相比,这对API设计没有任何改进。

        2
  •  3
  •   Daniel Langr    6 年前

    我的同事指出 find 与使用 map.lower_bound .

    这将导致不同类型地图之间的不一致。例如,不能实现自由函数 找到 使用 lower_bound 成员函数 std::unordered_map ,因为没有这样的成员函数(对于 google::dense_hash_map 等等)。有效的 找到 对于 unordered_map 需要访问类内部并需要知道其实现细节。那么,你最终会 map 没有 找到 成员函数和 无序映射 有一个。这将很难编写通用代码,允许用户在不同类型的映射之间进行选择,例如:

    template <class map_type>
    void (const map_type & map) {
       // use std::find or map.find here ???
    
        3
  •  0
  •   Caleth    6 年前

    std::map 有成员查找,因为 map::operator[] map::at 不要覆盖所有按键查找的用例。

    operator[] 需要 mapped_type 可违约构造 ,如果找不到地图,则修改地图的大小。

    at 如果找不到就扔。

    find 不受 运算符[] ,如果找不到,则既不修改也不抛出。