Bootstrap

【C++修炼之路 第五章】const_iterator 和 const iterator 的区别

在这里插入图片描述



速览重点:


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 用于遍历)




;