const_iterator 转成 iterator 的方法

本文介绍如何正确地从const_iterator转换到iterator。通过使用STL提供的advance和distance函数,可以实现从只读迭代器到可写迭代器的安全转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vector<int> vi;
typedef vector<int>::iterator Iter;
typedef vector<int>::const_iterator ConstIter;
Iter i;
ConstIter ci;
使用强制转换 i = (const_cast<Iter>(ci)) 会造成编译错误,不能将const_iterator强制转换成iterator。
在STL中,正确的转换方法是:
i = vi.begin();
advance(i, distance<ConstIter>(i,ci) );
这种方法非常简单和直接。为了得到一个与const_iterator指向相同位置的iterator,首先创建一个新的iterator,将它指向容器初始位置,然后取得const_iterator距离容器起始位置的偏移量,并将iterator向前移动相同的偏移量即可。
其中,advance和distance都在<iterator>头文件中。distance用来计算两个迭代器之间的距离,advance用来将一个迭代器移动指定的距离。
对于随机访问的迭代器(vector、string、deque),这种方法的时间是常数时间。对于双向迭代器(unordered_map)而言,时间是线性的。

转载于:https://www.cnblogs.com/ladawn/p/8320516.html

### 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]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值