为什么map有操作符[],set没有
Why does map have operator[] but set does not?
std::map
和std::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并不是很有用,因为映射会更有用,它确实具有你需要的功能。
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 如果没有malloc,链表实现将失败
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 错误 C2676:std::set::const_iterator 没有运算符 + 函数?
- 错误:'class std::unique_ptr<std::set<long unsigned int> >'没有名为 'size' 的成员
- 为什么map有操作符[],set没有
- 错误:没有匹配的构造函数来初始化"set<int>"
- 为什么C++std::set没有"at"功能,什么是内联替代方案
- 为什么 c++ 中没有重复的 protobuf 字段的 Set 方法
- STL SET 迭代器赋值 没有可行的候选者
- 'std::vector<int>'中没有命名'set'的成员
- std::ifstream set fail () 即使没有错误
- 在C++中对范围(没有重复项)进行排序是 std::vector 和 std::sort 比 std::set 快
- C++编译器错误:ISO C++禁止声明没有类型的“set”
- std::set没有前成员函数和后成员函数,这是设计原因吗
- 为什么我的对象没有插入到std::set中
- 没有自己的get方法的set方法是不好的做法吗?
- 为什么有序的std::map和有序的std::set没有被邀请进行transaction_safe
- 类没有从set和get方法C++返回正确的值
- boost::gregorian::d ate 没有“set-type”函数