请记住任何使用迭代器的 STL 容器。
以下是有效的:
iterator begin();
const_iterator begin() const;
const_iterator cbegin() const;
现在我不明白为什么第二行存在。有人可以提供一个很好的例子,其中 iterator begin();
不起作用并且它不能被 const_iterator cbegin();
取代......乞求需要const_iterator begin();
?
最佳答案
首先,有一个简单的历史原因:最初的 C++ 标准没有使用 cbegin()
而只有两个 begin()
重载。感觉有时获取非 const
序列的 const_iterator
和 cbegin()
和 cend( )
被添加(尽管 begin()
和 end()
members 实际上是错误的建议:我们会更好如果它们只是非成员函数)。也就是说,如果在引入 cbegin()
时移除了 begin()
的 const
重载,那么很多代码都会被破坏.
从实用的角度来看,同时拥有非const
和const
重载也是可取的:
- 在正常代码中使用
begin()
和cbegin()
可以 更改时实际这样做会很烦人对象的常量
- 更重要的是,在序列可以是
const
或非const
的通用(模板化)代码中,有必要使用一些舞蹈来使用正确的重载.
关于c++ - 为什么 STL 为 std::container::begin 和 std::container::end 函数提供 const 重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33983361/