c++ - 为什么 map 有 operator[] 而 set 没有?
问题描述
std::map
并且std::set
看起来与我非常相似(但在它们的使用和描述中),所以我不明白为什么std::set
不实现其版本的operator[]
. std::set
我怀疑它与 a中的元素是相关的事实const
,但即便如此,为什么不实现operator[]
返回const
引用或创建新元素的 an 呢?
根据第一个问题的答案,是否有可能/一个好主意创建一个std::set
实现的版本 a operator[]
?
解决方案
好吧,将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(这将是浪费),否则元素访问和迭代器语义会有点麻烦。也就是说,它在数学上是准确和一致的,但在实现上要么是浪费的,要么是复杂的。
推荐阅读
- sql - 使用 postgres 将 Excel 日期格式转换为常规日期
- flutter - “filterSearchResults”中else部分的setstate中的“data”值变为空值
- c# - 我可以在 MVC 中使用 Session 将(引用)对象从控制器传递到控制器吗?
- javascript - 如何在反应/打字稿中找到点击的元素和/或正确的事件
- kubernetes-helm - Helm 测试可以用于运行单独的套件吗?
- java - 使用 aspose.diagram java 读取组/容器内的形状
- python - 减去两个 Pandas 时区感知时间戳会得到 TypeError
- database - MongoDB + 连接查询,按计数分组
- vb.net - 在VB中制作一个href标签动态
- opencv - 如何在网络浏览器中创建二进制手形面具?- 打开简历