std::map
并且std::set
看起来与我非常相似(但是在使用和描述上),所以我不明白为什么std::set
不实现的版本operator[]
。我怀疑这与a std::set
中的元素are 的事实有关const
,但是即使如此,为什么还不实现operator[]
返回const
引用或创建新元素的an ?
根据对第一个问题的答案,创建一个std::set
实施的版本a是否可能/一个好主意operator[]
?
Use*_*ess 17
好吧,std::map<Key, Val>
将 Key 映射到Val。
也就是说,m[key]
产生对val的引用。您具有键,并且想要查找关联的值(或将值与该键关联)。
在中std::set<Elem>
,元素将是其自己的键。因此,您唯一可以得到的就是已经拥有的东西。您将使用此操作做什么?
集合不是用于将一件事映射到另一件事的-这就是映射的作用。集合用于记录元素是否属于某个集合。因此,唯一可以使用它的是在给定某些元素的情况下检查该元素是否为集合的成员。我们使用s.find(elem) != s.end()
c ++ 20中的or来实现s.contains(elem)
。
将该集合描述为std::set<Key, ...>
一个事实可能会引起混乱-我怀疑这仅仅是因为它用于搜索的方式与映射键相同。
原则上,您可以选择将集合描述为map<Elem, bool>
,但是除非您要真正存储布尔值(这将是浪费的),否则元素访问和迭代器的语义将有些冗长。也就是说,它在数学上是准确且一致的,但是实现起来既浪费又复杂。