C++ 为什么STL为std::container::begin和std::container::end函数提供常量重载?
记住任何使用迭代器的STL容器 以下各项有效:C++ 为什么STL为std::container::begin和std::container::end函数提供常量重载?,c++,c++11,stl,iterator,C++,C++11,Stl,Iterator,记住任何使用迭代器的STL容器 以下各项有效: iterator begin(); const_iterator begin() const; const_iterator cbegin() const; 现在我不明白为什么会有第二行。有人能提供一个很好的例子,其中迭代器begin()不起作用,它不能被const_迭代器cbegin()替换。。。乞求const_迭代器begin()?在语言中,可能没有一个地方不能给某个东西起不同的名字;这只是一个小小的善意行为,有点像std::string上的
iterator begin();
const_iterator begin() const;
const_iterator cbegin() const;
现在我不明白为什么会有第二行。有人能提供一个很好的例子,其中
迭代器begin()代码>不起作用,它不能被const_迭代器cbegin()替换代码>。。。乞求const_迭代器begin()代码>?在语言中,可能没有一个地方不能给某个东西起不同的名字;这只是一个小小的善意行为,有点像std::string
上的size()
和length()
在处理const
容器时,请记住使用cbegin
,这是一个PITA,因此const迭代器begin()const
非常有用。同时,当我明确想要获得一个const
迭代器时,如果没有cbegin
,我必须做一些复杂的事情,比如((const std::vector&)vec).begin()
,这肯定比vec.cbegin()
更难读/写
现在,你可能会争辩说,有些地方更需要像这样的小善意行为(哪种规模更好——支持正则/反向/常量迭代器的所有组合会使接口迅速爆炸),我当然同意你的看法
顺便说一句,使用const\u迭代器begin
可以避免其他操作,从而使基于范围的for循环在const
对象上正确工作;这只是一个小小的善意行为,有点像std::string
上的size()
和length()
在处理const
容器时,请记住使用cbegin
,这是一个PITA,因此const迭代器begin()const
非常有用。同时,当我明确想要获得一个const
迭代器时,如果没有cbegin
,我必须做一些复杂的事情,比如((const std::vector&)vec).begin()
,这肯定比vec.cbegin()
更难读/写
现在,你可能会争辩说,有些地方更需要像这样的小善意行为(哪种规模更好——支持正则/反向/常量迭代器的所有组合会使接口迅速爆炸),我当然同意你的看法
<> >顺便说一下,在<代码> const迭代器开始避免了其他的篡改,使得在代码> const 对象上正确地进行基于循环的范围工作。 首先,有一个简单的历史原因:原来的C++标准没有使用<代码> cNeX()/CODE >,并且只有两个代码>开始()(<代码)>重载。有人认为,有时将const\u迭代器
s添加到非const
序列和cbegin()
和cend()
是有用的(尽管begin()
和end()
成员实际上是不明智的:如果它们只是非成员函数,我们会做得更好)。也就是说,如果在引入cbegin()
时删除了begin()
的const
重载,那么很多代码都会被破坏
从实用的角度来看,还希望同时具有非常量
和常量
重载:
- 在普通代码中可以使用
begin()
和cbegin()
当更改对象的const
时,实际这样做会很烦人
- 更重要的是,在序列可以是
const
或非const
的通用(模板化)代码中,需要使用一些舞蹈来使用正确的重载
首先,有一个简单的历史原因:原来的C++标准没有使用<代码> cScript()/Cuffe >,并且只有两个代码>开始())/Cult>重载。有人认为,有时将
const\u迭代器
s添加到非const
序列和cbegin()
和cend()
是有用的(尽管begin()
和end()
成员实际上是不明智的:如果它们只是非成员函数,我们会做得更好)。也就是说,如果在引入cbegin()
时删除了begin()
的const
重载,那么很多代码都会被破坏
从实用的角度来看,还希望同时具有非常量
和常量
重载:
- 在普通代码中可以使用
begin()
和cbegin()
当更改对象的const
时,实际这样做会很烦人
- 更重要的是,在序列可以是
const
或非const
的通用(模板化)代码中,需要使用一些舞蹈来使用正确的重载
想想在const
函数中使用的容器类成员变量。如果没有常量迭代器,您将如何访问begin()
?提供您问题的答案。请考虑const
函数中使用的容器类成员变量的可能重复。如果没有常量迭代器,您将如何访问begin()
?提供您的问题的答案。可能重复的