std::set为什么没有front和back成员函数,这是否是出于设计原因?

24
  1. 我知道可以使用*s.begin(),但同样的参数也适用于vector,它有front/back
  2. 我经常使用set/map的有序属性来获取“最小”的元素/键 - 当然,我这样做不是有这个特性的原因,只是一个例子 :)

在这里,我谈论的是关于front/back为什么会是不好的设计的设计原因,所以请跳过明显的理由,比如委员会忘记了它……

1个回答

30

我想 "front" 和 "back" 这两个词是针对 sequence 容器(即那些元素的顺序由插入顺序决定的容器)保留的,这些词意味着在该序列中有一个物理位置。

由于 set 不是一个 sequence 容器(而是一个关联容器),因此这不合适。特别地,需要注意的是,“front”的含义可因后续插入一个无关元素而改变。


7
第二段并没有很有意义;通过push_back,向量的“back”也会发生变化。但是第一段加1分。 - Fred Foo
8
是的,如果你改变了“back”的含义,那么“back”也会随之改变。但是你必须明确地改变“back”的含义。在一个集合中,如果你明白我的意思,它将是一个不相关的改变。这个解释在思考列表时效果最好。 - Kerrek SB
如果你问我,std::list 是最好的例子,而 std::vector 有一个例外,即插入操作会使“back”失效,而 std::deque 则有一个例外,即在中间插入会使“front”和“back”都失效。这些陈述对于引用来说实际上是完全正确的。 - Kerrek SB
当然,引用不需要被无关的更新使其失效(如果我没记错的话,B树不能用于std::set因为失效问题),它们只是不再指向前面或后面。 - Fred Foo
@larsmans:确实,在标准库中,所有基于节点的容器在任意插入和删除期间都保留完整的迭代器和引用有效性。 - Kerrek SB
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接