【问题标题】:Is there a design reason why std::set doesnt have front and back member functions?std::set 没有前后成员函数是否有设计原因?
【发布时间】:2013-05-15 22:20:33
【问题描述】:
  1. 我知道我可以使用*s.begin(),但是同样的参数可以用于vector,它有front/back
  2. 我经常使用 set/map 的有序属性来获取“最小”元素/键 - 事实上 这样做并不是拥有它的原因,只是一个示例 :)

这里我说的是设计为什么front/back 会是糟糕的设计,所以请跳过明显的原因,比如委员会忘记了它......

【问题讨论】:

    标签: c++ set api-design member-functions design-decisions


    【解决方案1】:

    我想“前”和“后”这两个词是为 sequence 容器保留的(即元素的顺序由插入顺序决定的那些),这些词的意思是建议在该序列中的物理位置。

    由于set 不是序列容器(而是关联容器),因此这是不合适的。特别要注意的是,“front”的含义可能会因以后插入不相关的元素而改变。

    【讨论】:

    • 第二段真的没有意义; vectorback 也可以通过 push_back 更改。但第一段 +1。
    • @larsmans:是的,如果你改变背部,“背部”可以改变。但是你会明确地改变背部。如果你明白我的意思,在一个系列中,这将是一个无关的变化。当您考虑一个列表时,这种解释最有效。
    • (如果你愿意,std::list 是明星示例,std::vector 有一个例外,即插入使“后退”无效,std::deque 有一个例外,即中间的插入使两个“无效”前”和“后”。这些陈述实际上是真实的,供参考。)
    • 当然,不相关的更新不需要使引用失效(如果我没记错的话,由于失效问题,B-trees 不能用于std::set),它们只是不会指向前面或者再回来。
    • @larsmans:确实,在标准库中,所有基于节点的容器在任意插入和删除期间都保持完整的迭代器和引用有效性。
    猜你喜欢
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 2023-01-19
    相关资源
    最近更新 更多