首页 > 解决方案 > 为什么 map 有 operator[] 而 set 没有?

问题描述

std::map并且std::set看起来与我非常相似(但在它们的使用和描述中),所以我不明白为什么std::set不实现其版本的operator[]. std::set我怀疑它与 a中的元素是相关的事实const,但即便如此,为什么不实现operator[]返回const引用或创建新元素的 an 呢?

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

标签: c++stl

解决方案


好吧,将Keystd::map<Key, Val> 映射到 Val。

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

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

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

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

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


推荐阅读