为什么地图具有运算符[]但集合没有?

问题描述 投票:3回答:3

std::mapstd::set看起来与我非常相似(但是在使用和描述中),所以我不理解为什么std::set没有实现其operator[]的版本。我怀疑这与std::set中的元素为const的事实有关,但即使如此,为什么还不实现返回operator[]引用或创建新元素的const

根据对第一个问题的答案,有可能/创建一个实现std::setoperator[]版本的好主意吗?

c++ stl
3个回答
16
投票

Well,std::map<Key, Val> maps值键

m[key]产生对val的引用。您具有键,并且想要找到关联的值(或将值与该键关联)。

std::set<Elem>中,该元素将是其自己的键。因此,您唯一可以得到的就是已经拥有的东西。您将使用此操作做什么?

一个集不用于mapping一件事到另一件事-这就是map所做的事情。集合用于记录元素是否属于某个集合。因此,唯一可以使用它的是在给定某些元素的情况下检查该元素是否为集合的成员。我们使用s.find(elem) != s.end()或从c ++ 20开始使用s.contains(elem)

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

您原则上可以选择将集合描述为map<Elem, bool>,但是除非您要真正存储布尔值(这将是浪费的),否则元素访问和迭代器的语义将有些冗长。也就是说,它在数学上是准确且一致的,但实现起来既浪费又复杂。


1
投票

实际上,映射仅是关联数组,而不是整数索引,它使用键作为索引。

因为普通数组具有下标运算符,而映射具有类似的下标运算符。

另一方面,集合不是关联的数组。集合中的键是它们的数据。因此,出现了一个问题,例如set[key]的表达式应该返回什么?返回自身没有太大意义,而且当返回的值可能不会更改时也没有意义。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.