You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从boost::strided_iterator中获取底层迭代器?

问题解决:获取Boost strided适配器的底层迭代器

你代码里的核心问题是range-based for循环拿到的是容器元素,而非strided适配器的迭代器——所以it根本没有base()方法。要访问底层迭代器,你需要直接遍历strided适配器生成的range的迭代器,而不是遍历元素。

修正后的思路:

  • 用boost::adaptors::strided(16)生成跳步后的range
  • 遍历该range的迭代器(而非元素),每个迭代器调用base()即可获取指向原容器的底层迭代器
  • 从底层迭代器开始,取最多16个元素作为一行输出

修正后的代码示例:

#include <boost/range/adaptors.hpp>
#include <boost/range/iterator_range.hpp>
#include <iomanip>
#include <iostream>

// 假设value是类似std::vector<uint8_t>的扁平化二维数组
void print_flattened_2d(std::ostream& os, const auto& value) {
    auto output = [](auto& os, uint8_t val) -> decltype(auto) {
        return os << std::hex << std::setw(2) << std::setfill('0')
                  << static_cast<int>(val) << std::dec;
    };

    auto strided_range = value | boost::adaptors::strided(16);
    for (auto it = strided_range.begin(); it != strided_range.end(); ++it) {
        // 获取指向原容器的底层迭代器
        auto base_it = it.base();
        // 计算当前行的结束迭代器,避免越界
        size_t remaining = std::distance(base_it, value.end());
        auto end_it = std::next(base_it, std::min(static_cast<size_t>(16), remaining));
        
        for (auto elem_it = base_it; elem_it != end_it; ++elem_it) {
            if (elem_it != base_it) os << " ";
            output(os, *elem_it);
        }
        os << std::endl;
    }
}

补充说明:

  • strided(16)生成的迭代器每次跳16步,刚好指向每行的第一个元素
  • it.base()返回的就是原容器的原生迭代器,可直接用于遍历当前行元素
  • 计算end_it时用std::min处理最后一行元素不足16个的边界情况

内容的提问来源于stack exchange,提问作者Adrian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:01:17