如何从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
相关产品推荐
相关产品推荐

