C++ 为什么STL为std::container::begin和std::container::end函数提供常量重载?

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上的

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

以下各项有效:

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()
?提供您的问题的答案。可能重复的