const 容器是否只有 const 迭代器?

Does const containers have only const iterator?

为什么只 const STL 容器 return const_iterators?

例如 std::vectorstd::list 都重载了方法 begin 如:

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

我认为我仍然可以修改 const 向量的值,但不能修改向量本身。根据标准库,两者之间没有区别:

const std::vector<int>

const std::vector<const int>

如果您将向量声明为

const std::vector<int> foo;

那么向量本身就是const,这意味着你不能push_backerase等。但是,你可以修改它的元素

for (std::vector<int>::iterator it = foo.begin(); it != foo.end(); ++it)
{
    int& x = *it;
    x++;           // This is fine!
}

当您迭代一个向量时,您强制向量的 元素 const。所以你可以通过添加和删除东西来修改向量,但你可能不会修改实际的元素。

std::vector<Foo> values;  // Neither the vector nor its elements are const

for (std::vector<Foo>::const_iterator it = values.cbegin(), it != values.cend(); ++it)
{
    Foo const& foo = *it;         // I may not try to modify foo
    it->CallToNonConstMethod();   // Can't do this either
}

假设你有

iterator begin() const;

而不是

const_iterator begin() const;

现在,想想当你拥有

时会发生什么
const vector<Foo> v;

您将能够执行类似

的操作
*v.begin() = other_foo;

如果您想保留逻辑常量,这当然不合法。因此,解决方案是在 const 实例上调用迭代器时使 return 类型为 const_iterator

情况类似于具有指针成员的 const 类。在这些情况下,您可以修改指针指向的数据(但不是指针本身),因此不会保留逻辑常量性。标准库向前迈出了一步,并禁止通过 const 重载 return const_iterators.

对标准容器进行此类修改。