为什么map有操作符[],set没有

Why does map have operator[] but set does not?

本文关键字:set 没有 map 操作符 为什么      更新时间:2023-10-16

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

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

好吧,std::map<Key, Val>映射价值关键。

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

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

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

集合被描述为std::set<Key, ...>这一事实可能是一个混乱的来源——我怀疑这只是因为它以与映射键相同的方式用于搜索。

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

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

由于普通数组有下标运算符,那么映射也有类似的下标运算符。

另一方面,集合不是关联的数组。集合中的关键帧是它们的数据。因此,出现了一个问题,像set[key]这样的表达式应该返回什么?返回本身没有什么意义,而且返回的值可能不会改变。

如果你想知道元素的键,那么使用set并不是很有用,因为映射会更有用,它确实具有你需要的功能。