由于std::set
的元素按排序顺序排列,并且每个元素都是唯一的。我们也不能修改set
的元素,那么为什么库提供了begin()
和end()
函数,因为我们已经有cbegin()
和cend()
。为什么std :: set在我们无法修改集合元素时提供了begin()和end()
3
A
回答
7
因为如果您删除了这些功能,您将无法在需要Container的许多地方使用std::set
。最明显的一个(对我来说):
for (auto x: mySet) { }
,因为环路基于范围的依靠begin
和end
,不cbegin
或cend
(§ 6.5.4/1.3)是不可能的。其他
一个例子,这将带来一个问题将是std::begin
功能,正如你可以在链接看到,依靠c.begin()
,而不是c.end()
。
其基本思想是您不希望std::set
与其他标准容器有不同的接口。
有很多这样的地方,这只是其中的一个例子。
注意,即使std::cbegin
依靠const
- 过载的c.begin()
,而不是c.cbegin()
。
3
cbegin()
和cend()
被添加在C++ 11 begin()
和end()
是访问一套旧的方式和他们保持了复古的兼容性。
+0
尽管这或多或少是真的,但它并没有回答这个问题。通用代码需要一致的接口,'begin()'和'end()'是将迭代器放入容器中最常用的方法。即使'std :: set'被设计时''cbegin()'和'cend()'已经出现了,它仍然会提供'begin()'和'end()'。 –
相关问题
- 1. 对于std :: set,std :: inserter使用.begin()和.end()是否有区别?
- 2. 为什么我无法在开始时修改列表元素?
- 3. begin()== end()是什么?
- 4. STL算法的begin()和end()
- 5. 为什么std :: basic_string :: substr不遵循[begin,end]约定?
- 6. std :: begin和end的const重载的目的是什么?
- 7. 修改std :: set的元素 - 定义的行为?
- 8. 缺少BEGIN和END?
- 9. 在Visual Studio中std :: begin和std :: end迭代器
- 10. 修改集合的每个元素
- 11. 通过迭代器修改std :: set元素:为什么我的代码不能编译?
- 12. BEGIN-END BEGIN TRY-END TRY内部
- 13. 如何使用.begin()和.end()没有.resize()为std :: vector?
- 14. set :: end ++的值是什么?
- 15. 为什么我不能创建一个视图BEGIN ... END块
- 16. 当我将它们转换为Set时,LinkedHashMap元素会发生什么?
- 17. 如果... BEGIN ... END
- 18. std :: set和std :: vector有什么区别?
- 19. 在C++中使用begin()和end()
- 20. dfs.replication提供了复制因素,file.replication提供了什么
- 21. 在Mercurial中,为什么我们无法在有其他修改过的文件时退出提交?
- 22. std :: set元素消失
- 23. 为什么我无法更改getter返回的集合?
- 24. 为什么Controls集合不提供所有IEnumerable方法?
- 25. 为什么Java集合不提供方便的映射方法?
- 26. 为什么Java提供了两种从队列中移除元素的方法?
- 27. 为什么迭代时我们无法将元素移除到CopyOnWriteArrayList?
- 28. 无法在迭代器的std :: set中插入元素到std :: list
- 29. 使用begin()和end()可以创建std :: array吗?
- 30. 当我们在文件上使用“open with”时,它提供了什么参数?
'c'迭代器函数是在C++ 11中引入的,在不支持可变迭代器的容器上摆脱'begin'等等会破坏很多现有的代码。 – user657267
你每天都会学到新的东西。撤回评论。 – Smeeheey
当然,必须有'begin'和'end',或者你不想遍历集合? –