C++不同类型指针错误减法:FlattenedVector迭代器计算异常
修复FlattenedVectorIterator的operator-计算错误问题
问题根源
你在get_global_position里的核心错误:将迭代器outIt的地址强转为InIterator*来获取子数组起始迭代器,这是完全错误的类型转换操作。outIt是指向外层std::vector<std::vector<T>>元素的迭代器,它指向的对象才是子std::vector<T>,正确的子数组起始迭代器应该是(*outIt).begin(),而非对outIt的地址做强制类型转换。
修复方案
修改get_global_position函数的实现逻辑:
- 移除对
outIt地址的强转操作,直接通过*outIt获取当前子vector对象 - 以子vector的
begin()作为起始迭代器计算内部偏移量 - 结合前缀和数组
pref计算前面所有子vector的总元素数,加上当前子vector内的偏移量得到全局位置
示例修复代码
// 假设InIterator为std::vector<T>::iterator,ll为long long类型 ll get_global_position(const FlattenedVectorIterator& it) const { // 计算当前外层迭代器对应的索引 size_t outer_idx = it.outIt - this->data.begin(); // 前面所有子vector的总元素数 ll prev_total = outer_idx > 0 ? pref[outer_idx - 1] : 0; // 当前子vector内的偏移量:inIt减去当前子vector的起始迭代器 ll current_offset = it.inIt - (*it.outIt).begin(); return prev_total + current_offset; }
额外注意事项
- 确保
pref前缀和数组的正确性:pref[i]需准确存储前i+1个子vector的元素总数之和(或根据你的定义调整,核心是快速获取前N个子vector的总元素数) - 迭代器的
outIt必须始终指向外层vector的有效元素,inIt必须落在当前子vector的合法范围内 - 内存占用控制:使用指针和迭代器(64位下各占8字节),搭配
pref指针、外层数据指针,总大小可控制在40字节以内
内容的提问来源于stack exchange,提问作者Robocat
相关产品推荐
相关产品推荐

