C++STL为什么要有const_iterator

这是个困扰我很久了的问题,可能一开始对面向对象的理解不够深。

刚刚想明白了,随手记录一下。


  • 先从const iterator和const_iterator说起

const iterator 是iterator本身是个常量,iterator本身里面存的是指针,也就是iterator的值,也就是那个指针不能改变,也就是不能指向其他的位置,但是所指向的位置的元素是可以通过这个iterator来改变的。

const_iterator 其实本质来说,是另一个类。我们可以想象成,它的数据成员是一个指向常量元素的指针,(比如 const T*)也就是说,这个const_iterator里存着的指针是可以改变的,即可以 ++ 或 - - 操作,但是,这是一个指向常量的指针,指向的元素是常量,不可改变。

  • 有点绕,我们再从一个例子扒一扒。
vector<int> ivec1(10);
const vector<int> ivec2(10);
vector<int>
### Qt 中 `const_iterator` 的使用方法 在 C++ 和 Qt 编程中,容器类通常提供迭代器来遍历其内部存储的元素。为了防止意外修改容器中的元素,在访问只读数据时应使用 `const_iterator`。 #### 使用 `const_iterator` 当定义一个常量对象或函数参数声明为常量引用时,只能通过 `const_iterator` 来遍历该对象: ```cpp #include <QVector> #include <iostream> void printValues(const QVector<int>& vec) { // 获取 const_iterator 类型的起始位置 auto it = vec.cbegin(); // 或者使用 vec.constBegin() while (it != vec.cend()) { // cend() 返回指向末尾之后的位置 std::cout << *it << " "; ++it; } } ``` 上述代码展示了如何利用成员函数 `cbegin()` 和 `cend()` 创建一对 `const_iterator`,用于安全地读取向量的内容[^1]。 #### 基于范围的 for 循环与 `const_iterator` 如果希望简化语法并保持不可变性,则可以采用基于范围的 for 循环配合右引用的方式实现相同功能: ```cpp // 定义一个只读版本的打印函数 void printValuesRangeBased(const QVector<int> &vec) { for (auto&& val : vec) { qDebug() << val; } } // 或者更严格地指定为 const 引用 for (const int& element : vec) { qDebug() << element; } ``` 这里不仅限定了变量的作用域,还确保了不会无意间改变原始集合内的任何项。 #### 实际应用场景下的注意事项 尽管 `QLinkedList` 提供了一些特性使其适用于特定场景,但在多线程环境中操作共享资源时需格外小心。虽然存在像 `QSemaphore` 这样的同步机制可以帮助管理并发访问,但这并不意味着可以直接依赖它们代替标准 STL 容器的选择[^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值