2016-08-05 84 views
3

由于std::set的元素按排序顺序排列,并且每个元素都是唯一的。我们也不能修改set的元素,那么为什么库提供了begin()end()函数,因为我们已经有cbegin()cend()为什么std :: set在我们无法修改集合元素时提供了begin()和end()

+1

'c'迭代器函数是在C++ 11中引入的,在不支持可变迭代器的容器上摆脱'begin'等等会破坏很多现有的代码。 – user657267

+1

你每天都会学到新的东西。撤回评论。 – Smeeheey

+1

当然,必须有'begin'和'end',或者你不想遍历集合? –

回答

7

因为如果您删除了这些功能,您将无法在需要Container的许多地方使用std::set。最明显的一个(对我来说):

for (auto x: mySet) { } 

,因为环路基于范围的依靠beginend,不cbegincend(§ 6.5.4/1.3)是不可能的。其他

一个例子,这将带来一个问题将是std::begin 功能,正如你可以在链接看到,依靠c.begin(),而不是c.end()

其基本思想是您不希望std::set与其他标准容器有不同的接口

有很多这样的地方,这只是其中的一个例子。

注意,即使std::cbegin依靠const - 过载的c.begin(),而不是c.cbegin()

+0

不是一个好的参数,因为'std :: set'和'for(auto x:y)'都是由同一个标准定义的。标准可能只是说,如果容器缺少'begin',那么将使用'cbegin'。 – MSalters

+0

@ MSalters我认为标准希望为其所有容器提供一致的接口(正如我在回答中所说的那样),从'std :: set'中删除'begin'会破坏(或者必须改变对容器的概念,这将意味着什么都没有改变)。但这就是我的全部观点(复古兼容性可能也是一个原因,但我不认为它是唯一的一个)。 – Holt

3

cbegin()cend()被添加在C++ 11 begin()end()是访问一套旧的方式和他们保持了复古的兼容性。

+0

尽管这或多或少是真的,但它并没有回答这个问题。通用代码需要一致的接口,'begin()'和'end()'是将迭代器放入容器中最常用的方法。即使'std :: set'被设计时''cbegin()'和'cend()'已经出现了,它仍然会提供'begin()'和'end()'。 –

相关问题