为什么const
STL容器只返回const_iterator
s?
例如,std::vector
和std::list
都有方法begin
重载
为:
iterator begin();
const_iterator begin() const;
const_iterator cbegin() const;
我以为我仍然可以修改const向量的值但不能修改向量本身。根据标准库,之间没有区别:
const std::vector<int>
和
const std::vector<const int>
答案 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;
,这意味着您无法const
,push_back
等。但是,您可以修改其元素
erase
当您迭代向量时,您强制执行向量的元素 for (std::vector<int>::iterator it = foo.begin(); it != foo.end(); ++it)
{
int& x = *it;
x++; // This is fine!
}
。因此,您可以通过添加和删除内容来修改矢量,但您可能无法修改实际元素。
const