常量容器是否只有常量迭代器
Does const containers have only const iterator?
为什么const
STL 容器只返回 const_iterator
s?
例如,std::vector
和std::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_back
、erase
等。但是,您可以修改其元素
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
}
相关文章:
- 是否应避免从非常量迭代器转换为常量迭代器?
- 如何实现常量迭代器?
- 是否可以重用通常的迭代器来构建常量迭代器?
- 使用 declval 获取非常量迭代器
- 为什么在此代码中隐式转换为常量迭代器失败?
- 常量迭代器的问题
- 链表常量迭代器
- 属性树常量迭代器的索引
- 如何正确地声明从非常量迭代器到指针的常量指针
- 无法取消引用映射常量迭代器的mapped_type
- 强制 foreach 使用常量迭代器
- 使用常量迭代器的运算符重载
- unordered_set 非常量迭代器
- 常量迭代器与可变迭代器:相同的算法不同的代码
- 自定义迭代器和自定义常量迭代器之间的转换
- 从常量迭代器到映射向量,获取映射向量中映射元素的键和值
- 在 C++14 中,常量迭代器仍然是邪恶的吗?
- 用常量迭代器从STL容器中擦除
- c++ STL,常量迭代器,find()
- 在 Boost 的多索引容器中获取一个非常量迭代器