const容器只有const迭代器吗?

时间:2015-06-18 19:40:59

标签: c++ stl iterator standard-library

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

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

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

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

const std::vector<int>

const std::vector<const int>

2 个答案:

答案 0 :(得分:3)

假设你有

iterator begin() const;

而不是

const_iterator begin() const;

现在,想想当你有

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

您将能够执行类似

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

如果你想保留逻辑常量,那当然不应该是合法的。因此,只要在const_iterator实例上调用迭代器,解决方案就是返回类型const

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

答案 1 :(得分:0)

如果您将矢量声明为

4mail.org.apache.juli.FileHandler.level = ALL
4mail.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
4mail.org.apache.juli.FileHandler.prefix = mail.

然后,向量本身为const std::vector<int> foo; ,这意味着您无法constpush_back等。但是,您可以修改其元素

erase

当您迭代向量时,您强制执行向量的元素 for (std::vector<int>::iterator it = foo.begin(); it != foo.end(); ++it) { int& x = *it; x++; // This is fine! } 。因此,您可以通过添加和删除内容来修改矢量,但您可能无法修改实际元素。

const