如何使用range-v3扁平化结构体容器?以Point结构体为例
使用range-v3库扁平化结构体容器的方法
要实现将std::vector<Point>扁平化为std::vector<double>(按每个Point的x、y依次排列),可以用range-v3库的视图组合完成,以下是两种简洁的实现方式:
完整代码示例
#include <vector> #include <range/v3/all.hpp> struct Point{ double x; double y; }; int main() { std::vector<Point> points { { 0, 0 }, { 1, 1 }, { 2, 2 } }; // 方法1:利用for_each和yield生成多元素输出 auto flattened1 = points | ranges::views::for_each([](const Point& p) { return ranges::yield(p.x) | ranges::yield(p.y); }) | ranges::to<std::vector<double>>(); // 方法2:先转换为子range再合并 auto flattened2 = points | ranges::views::transform([](const Point& p) { return ranges::views::single(p.x) | ranges::views::concat(ranges::views::single(p.y)); }) | ranges::views::join | ranges::to<std::vector<double>>(); // 两种方法最终结果均为 {0, 0, 1, 1, 2, 2} return 0; }
方法说明
- 方法1:
ranges::views::for_each支持为每个输入元素生成多个输出元素,ranges::yield用于逐个输出Point的x和y,最终直接得到扁平化的range,再通过ranges::to转换为目标容器。 - 方法2:先用
transform将每个Point转换为包含x、y的子range,再通过ranges::views::join将所有子range合并成一个扁平化的range,最后转换为vector。
内容的提问来源于stack exchange,提问作者gk2
相关产品推荐
相关产品推荐

