const 容器是否只有 const 迭代器?
Does const containers have only const iterator?
为什么只 const
STL 容器 return 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>
如果您将向量声明为
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
}
假设你有
iterator begin() const;
而不是
const_iterator begin() const;
现在,想想当你拥有
时会发生什么
const vector<Foo> v;
您将能够执行类似
的操作
*v.begin() = other_foo;
如果您想保留逻辑常量,这当然不合法。因此,解决方案是在 const
实例上调用迭代器时使 return 类型为 const_iterator
。
情况类似于具有指针成员的 const
类。在这些情况下,您可以修改指针指向的数据(但不是指针本身),因此不会保留逻辑常量性。标准库向前迈出了一步,并禁止通过 const
重载 return const_iterator
s.
对标准容器进行此类修改。
为什么只 const
STL 容器 return 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>
如果您将向量声明为
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
}
假设你有
iterator begin() const;
而不是
const_iterator begin() const;
现在,想想当你拥有
时会发生什么const vector<Foo> v;
您将能够执行类似
的操作*v.begin() = other_foo;
如果您想保留逻辑常量,这当然不合法。因此,解决方案是在 const
实例上调用迭代器时使 return 类型为 const_iterator
。
情况类似于具有指针成员的 const
类。在这些情况下,您可以修改指针指向的数据(但不是指针本身),因此不会保留逻辑常量性。标准库向前迈出了一步,并禁止通过 const
重载 return const_iterator
s.