【问题标题】:Why does map have operator[] but set does not?为什么 map 有 operator[] 而 set 没有?
【发布时间】:2019-10-25 09:24:50
【问题描述】:

std::mapstd::set 似乎与我非常相似(但在它们的使用和描述中),所以我不明白为什么std::set 没有实现它的operator[] 版本。 我怀疑这与std::set 中的元素是const 的事实有关,但即便如此,为什么不实现一个返回const 引用或创建新元素的operator[]

根据第一个问题的答案,创建一个实现operator[]std::set 版本是否可能/一个好主意?

【问题讨论】:

    标签: c++ stl


    【解决方案1】:

    嗯,std::map<Key, Val> 地图 Val.

    也就是说,m[key] 产生对 val 的引用。您有键,并希望找到关联的值(或将值与该键关联)。

    std::set<Elem> 中,元素将是它自己的键。所以,你唯一能取回的就是你已经拥有的东西。你会用这个操作做什么?

    集合不是为了将一件事映射到另一件事——这就是 map 的作用。集合用于记录一个元素是否属于某个集合。因此,使用它的唯一明智的事情是检查给定某个元素,该元素是否是集合的成员。我们使用s.find(elem) != s.end() 或c++20 中的s.contains(elem) 来执行此操作。

    集合被描述为std::set<Key, ...> 的事实可能会造成混淆 - 我怀疑这只是因为它用于搜索的方式与映射键相同。

    您原则上可以选择将集合表征为map<Elem, bool>,但除非您想真正存储布尔值(这会很浪费),否则元素访问和迭代器语义会有点麻烦。也就是说,它在数学上是准确和一致的,但在实现上要么是浪费的,要么是复杂的。

    【讨论】:

      【解决方案2】:

      事实上,映射只是一个关联数组,而不是整数索引,它使用键作为索引。

      因为普通数组有下标运算符 then 而地图也有类似的下标运算符。

      另一方面,集合不是关联数组。在集合中,键是他们的数据。那么问题来了,像set[key] 这样的表达式应该返回什么?返回本身并没有太大意义,而且返回的值可能不会改变。

      【讨论】:

        【解决方案3】:

        如果您想知道元素的键,使用 set 不会很有用,因为 map 会更有用,它确实具有您需要的功能。

        【讨论】:

          猜你喜欢
          • 2016-03-15
          • 2016-02-06
          • 1970-01-01
          • 2010-11-09
          • 2015-03-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多