使用Boost transformed适配器转换为std::vector出现报错问题咨询
问题原因与解决
核心逻辑
boost::adaptors::transformed 返回的是 transform_range 类型的惰性视图对象,而非你预期的 std::vector 容器:
- 该视图属于惰性求值设计,本身不会存储转换后的完整数据,仅持有原容器的引用和传入的转换函数,只有实际访问元素时才会实时调用转换函数计算对应位置的结果,避免不必要的性能损耗。
- 该视图类型没有定义到
std::vector的隐式转换规则,因此无法直接赋值给std::vector对象。
现象差异说明
std::pair<blabla2, double> x = histogram[0];可正常运行:视图类型重载了operator[]运算符,访问下标时会实时调用lambda函数计算对应位置的转换结果,返回的临时std::pair对象可以直接用于构造x,因此没有报错。- 直接赋值给
std::vector报错:std::vector的构造函数没有适配该视图类型,也不存在对应的隐式转换规则,因此无法完成直接赋值。
修复方案
如果需要将视图转换为实际的 std::vector 容器,使用迭代器范围构造即可:
std::vector<std::pair<blabla2, double>> histogramtest(histogram.begin(), histogram.end());
若使用的Boost版本支持 to 适配器,也可以写为更简洁的链式调用形式:
auto histogramtest = test | transformed(foo) | boost::adaptors::to<std::vector<std::pair<blabla2, double>>>();
小提示:视图仅持有原容器的引用,若视图使用期间原容器被销毁、增减元素,会导致未定义行为;如果需要完全脱离原容器使用转换后的数据,建议直接转成实际容器存储。
内容的提问来源于stack exchange,提问作者Daniyal Yasin
相关产品推荐
相关产品推荐

