C++实现flatten:扁平化容器的容器的容器。。。

2023-05-16

zip、map/reduce、flatten是比较有意思的通用算法。zip在boost::iterator里有了,map/reduce是用transfom、accumulate、inner_product实现的。

flatten就没找到了,那就造个吧:

template<typename T, typename C>
constexpr void do_flatten(const C & c, T & ret) 
{
    for (const auto & x : c)
    {
        if constexpr (is_same<typename T::value_type, typename C::value_type>::value)
        {
            ret.push_back(x); 
        }
        else
        {
            do_flatten(x, ret);    
        }
    }
}

template<typename T, typename ... C>
    T flatten( C && ... c) 
{
    T ret;
    auto cookie = {(do_flatten(c, ret),0)...};
    return ret;
}

 测试:

    vector<vector<int>> v{{1, 2}, {3, 4, 5}, {6,7,8,9}};
    vector<int> r = flatten<vector<int>>(v);
    for(auto x : r)
    {
        cout << x << " ";    
    }

当然了,如果想实现为适配成iterator的方式,如boost::range,能缓式计算,就要多好多代码了,感觉C++新语法就帮助有限了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++实现flatten:扁平化容器的容器的容器。。。 的相关文章

  • 如何合并多个未知长度的平面数组,转置它们,然后形成一维数组?

    我有 3 个这样的数组 a array 0 gt a1 1 gt a2 2 gt a3 b array 0 gt b1 1 gt b2 2 gt b3 c array 0 gt c1 1 gt c2 2 gt c3 我喜欢这样的东西 r a
  • 使用 common lisp 展平列表

    我正在读 Paul Graham 写的 On Lisp 一书 在第 4 章 实用函数 中 他给出了对列表进行操作的小函数的示例 这在编写较大的程序时会很有帮助 其中之一是flatten 给定任意级别的嵌套列表作为参数 展平将删除所有嵌套元素
  • 对数组中的值从小到大进行排序/排序

    我有一个这样的公式 ArrayFormula sort INDEX B 1 B 10 MATCH E1 A 1 A 10 0 in columns A B a 1 b 2 c 3 d 4 e 5 f 6 g 7 h 8 i 9 j 10 a
  • 转换二维数组

    What is selectMany ToArray 方法 它是一个内置方法吗C 我需要将二维数组转换为一维数组 如果你的意思是jagged array T SelectMany是你的朋友 但是 如果您的意思是矩形的 array T 那么你
  • 如何展平多维数组?

    在 PHP 中 是否可以在不使用递归或引用的情况下展平 双 多 维数组 我只对值感兴趣 因此可以忽略键 我在想array map and array values 可以在以下位置找到更新的解决方案下面这个答案 As of PHP 5 3最短
  • 使用连续的 Either/Maybe 时减少嵌套

    这可能是一个非常基本的 Haskell 问题 但让我们假设以下函数签名 helper functions getWeatherInfo Day gt IO Either WeatherException WeatherInfo craftQ
  • 如何在Python中将异构列表扁平化为单个列表? [复制]

    这个问题在这里已经有答案了 我有一个对象列表 其中对象可以是列表或标量 我想要一个只有标量的扁平列表 例如 L 35 53 525 6743 64 63 743 754 757 outputList 35 53 525 6743 64 63
  • 用索引展平嵌套列表

    给定一个任意大小的任意深度嵌套列表的列表 我想要一个对树中所有元素进行平面 深度优先的迭代器 但也具有路径索引 使得 for x y in flatten L x L y 0 y 1 y 1 That is L 1 2 3 4 5 6 7
  • 如何自定义 Google 表格中答案为“是”时连接的标头值的顺序

    我怎样才能修改这个方程谷歌电子表格 https docs google com spreadsheets d 1tHL2IdijLaAD5my7m4a1uaiXNleb6Z1bI7x HPXfAVI edit usp sharing我发现这
  • Julia:展平数组/元组的数组

    在朱莉娅vec将多维数组重塑为一维数组 但是 它不适用于数组的数组或元组的数组 除了使用数组理解之外 还有另一种方法可以展平数组 元组的数组吗 或者数组的数组 数组 元组的数组 或者 Iterators flatten x 创建一个迭代每个
  • 展平 JavaScript 对象以作为查询字符串传递

    我有一个 javascript 对象 需要将其展平为字符串 以便可以作为查询字符串传递 我该怎么做 IE cost 12345 insertBy testUser 会成为cost 12345 insertBy testUser 我不能使用
  • 如何展平Nuget包内容文件?

    Nuget 包问题 buildAction copyToOutput flatten 被忽略 包项目 ThisProject vbproj Net 标准库 2 0 nuspec 文件
  • 雪花 - 横向不能位于连接的左侧

    我有一个变体数据类型 我正在对其执行横向展平 但随后我需要左连接其中一个 json 元素 以从 Snowflake 中的另一个关系表中查找相应 ID 的值 当我这样做时 它会给我错误 横向视图不能位于连接的左侧 这是没有意义的 因为如果我不
  • 展平嵌套数组。 (爪哇)

    我正在努力创建正确的逻辑来展平数组 我本质上想为嵌套数组中的每个子项复制父行 嵌套数组的数量可能会有所不同 我一直在创建 Java 列表 因为我发现它们很容易使用 但对任何解决方案都开放 这个问题的本质是我从一些嵌套的 JSON 开始 我想
  • 如何在Python中展平元组

    我有一个列表的以下元素 该列表有 100 个元素长 50 2 7387451803816479e 13 219 如何将每个元素转换为如下所示 50 2 7387451803816479e 13 219 a b c for a b c in
  • 展平数据框

    我有这个嵌套数据框 test lt structure list id c 13 27 seq structure list 1 c 1997 1997 1997 2007 2 c 2007 2007 2007 2007 2007 2007
  • 如何“合并”、“展平”或“透视”将多行返回到单个结果的查询结果?

    我对表进行了一个简单的查询 它返回如下结果 id id type id ref 2702 5 31 2702 16 14 2702 17 3 2702 40 1 2703 23 4 2703 23 5 2703 34 6 2704 1 14
  • 将包含对象的数组压平为 1 个对象

    给定输入 a 1 b 2 c 3 如何返回 a 1 b 2 c 3 对于数组这不是一个问题 http underscorejs org flatten使用 lodash 但这里我们有对象数组 Use Object assign https
  • 展平数组:保持索引、值等于数组中的位置

    我在尝试以特定方式展平数组时遇到了一些麻烦 这里有一个print r我想要展平的数组的视图 Array 1 gt Array 8 gt 1 9 gt 2 10 gt Array 15 gt Array 22 gt 1
  • Javascript 中的深平面多维数组[重复]

    这个问题在这里已经有答案了 我想编写一个可以深度展平给定数组的函数 例如 deepFlatten deepFlatten 1 2 3 1 2 3 deepFlatten 1 2 3 a b c 1 2 3 1 2 3 a b c 1 2 3

随机推荐