常量容器是否只有常量迭代器

Does const containers have only const iterator?

本文关键字:常量 迭代器 是否      更新时间:2023-10-16

为什么const STL 容器只返回 const_iterator s?

例如,std::vectorstd::list都具有重载begin的方法如:

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

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

const std::vector<int>

const std::vector<const int>

假设你有

iterator begin() const;

而不是

const_iterator begin() const;

现在,想想当你有

const vector<Foo> v;

您将能够做类似的事情

*v.begin() = other_foo;
如果你想

保持逻辑恒定性,这当然不应该是合法的。因此,解决方案是使返回类型const_iterator,只要您在const实例上调用迭代器。

这种情况类似于具有具有指针成员的类const。在这些情况下,您可以修改指针指向的数据(但不能修改指针本身),因此逻辑常量不会保留。标准库向前迈出了一步,不允许通过返回 const_iterator s 的重载const标准容器上进行此类修改。

如果你将向量声明为

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
}