c++ - 为什么 STL 为 std::container::begin 和 std::container::end 函数提供 const 重载?

标签 c++ c++11 stl iterator

请记住任何使用迭代器的 STL 容器。

以下是有效的:

iterator begin();
const_iterator begin() const;
const_iterator cbegin() const;

现在我不明白为什么第二行存在。有人可以提供一个很好的例子,其中 iterator begin(); 不起作用并且它不能被 const_iterator cbegin(); 取代......乞求需要const_iterator begin();?

最佳答案

首先,有一个简单的历史原因:最初的 C++ 标准没有使用 cbegin() 而只有两个 begin() 重载。感觉有时获取非 const 序列的 const_iteratorcbegin()cend( ) 被添加(尽管 begin()end() members 实际上是错误的建议:我们会更好如果它们只是非成员函数)。也就是说,如果在引入 cbegin() 时移除了 begin()const 重载,那么很多代码都会被破坏.

从实用的角度来看,同时拥有非constconst 重载也是可取的:

  • 在正常代码中使用 begin()cbegin() 可以 更改时实际这样做会很烦人对象的常量
  • 更重要的是,在序列可以是 const 或非 const 的通用(模板化)代码中,有必要使用一些舞蹈来使用正确的重载.

关于c++ - 为什么 STL 为 std::container::begin 和 std::container::end 函数提供 const 重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33983361/

相关文章:

c++ - 是否有缺少固定宽度类型 (intXX_t) 的平台?

c++ - 如何解决以下代码中的函数重载歧义

c++ - ios::app 模式和 fstream::write 是否彼此不兼容?

android - Gradle + Cmake 在连接路径时添加意外的引号

c++ - std::vector::insert 是否按定义保留?

c++ - 检查数组中消息的最有效方法

c++ - 删除的默认构造函数仍然是微不足道的吗?

c++ - 关于在 C++ 中的集合 STL 中存储文件路径

c++ - 交换 std::list 中的相邻元素

c++ - 在所有操作系统中应用文件统计(统计的结构类型)