速览重点:
const_iterator :表示 迭代器指向的数据 不能写
const iterator :表示 迭代器本身不能写
⭐🐔 以 int 类型的 const 修饰来类比解释 const_iterator 和 const iterator*
int* p; // 指针p 类比 iterator
const int* p; // 表示指针p指向的内容 *p 不能修改:这里类比 const_iterator
int* const p; // 表示指针p本身不能修改:这里类比 const iterator
关于 const_iterator 迭代器 :是 保护迭代器指向的数据 不能写
从这段程序看起:第二句程序报错
int main()
{
const string s1 = "hello world"; // const 修饰 s1,使 s1 不能修改
string::iterator it1 = s1.begin(); // 这里直接 报错
while (it1 != s1.end()) {
cout << *it1 << ' ';
++it1;
}
}
⭐🐔报错原因:const 修饰 s1,begin() 会调用 第二条函数,返回 const_iterator 类型的迭代器
- iterator 可读可写
- const_iterator 只读
string::iterator it1 = s1.begin(); // 报错
而这里 string::iterator 是可读可写的,因此这里属于权限放大
⭐🐔疑问:为什么不是 const iterator ?即为什么不是 const 修饰 iterator ,而是重新命名成const_iterator
const_iterator 是保护迭代器指向的数据不能写
这里是迭代器访问别人,(是别人不能写),而不是读写迭代器本身
如果 const 修饰 迭代器,则会使 迭代器本身不能修改:则 ++it 失效
(而要使迭代器本身不能写就要用const修饰:const iterator)
总结:const_iterator 是另一个类型,表示 迭代器指向的内容不能修改(但是迭代器本身是可以修改的,++it 用于遍历)