• 面试最常问的数组转树,树转数组 c++ web框架paozhu实现


    刚毕业同学,找工作常被问 二维数组转树,树转二维数组 需要支持无限层级实现,如果你了解这个语言那么实现起来还要一番思考

    c++ web框架 paozhu使用 需要实现数据库表数据到前台菜单实现,就是这种功能 二维数组转树,树转二维数组 保存时候树二维数组,展示时候树树状。

    这个技术难点在于无限递归,这个树程序基本原理

    现在看看c++怎么实现的,无限递归,家肯定是考虑到结构体 嵌套自己定义。

    复制代码
    struct department_outjson_t
    {
      unsigned int id          = 0;
      unsigned int parentid    = 0;
      bool isopen              = true;
      bool _is_use             = false;
      std::string title;
      std::string desc;
      std::vector children;
    
    };
    复制代码
    department_outjson_t 就是结构体 嵌套定义
    我们看看怎么实现的,先上代码,使用了模板

    复制代码
    template 
    concept ishas_isuse_member = requires(deps_json_type m) { m._is_use; };
    
    template 
      requires ishas_isuse_member
    void array_to_tree(std::vector &targetdata,
                       std::vector &sourcedata)
    {
    
      if (targetdata.size() == 0)
      {
        for (unsigned int i = 0; i < sourcedata.size(); i++)
        {
          if (sourcedata[i].parentid == 0)
          {
            targetdata.push_back(sourcedata[i]);
            sourcedata[i]._is_use = true;
          }
        }
      }
    
      for (unsigned int i = 0; i < sourcedata.size(); i++)
      {
        if (sourcedata[i]._is_use == false)
        {
          for (unsigned int j = 0; j < targetdata.size(); j++)
          {
            if (targetdata[j].id == sourcedata[i].parentid)
            {
              targetdata[j].children.push_back(sourcedata[i]);
              sourcedata[i]._is_use = true;
              array_to_tree(targetdata[j].children, sourcedata);
            }
          }
        }
      }
    }
    复制代码

     

    就是这样可以实现了,注意是使用了扫描,怕影响性能,我用一个变量标注,当然也可以用保存地址方式。

     

    顺便把 树转二维数组也实现了

    复制代码
    template 
    void tree_to_array(std::vector &targetdata,
                       std::vector &sourcedata,
                       unsigned int parendid = 0)
    {
    
      for (unsigned int i = 0; i < sourcedata.size(); i++)
      {
        if (sourcedata[i].parentid == parendid)
        {
          if (sourcedata[i].children.size() > 0)
          {
            deps_json_type temp = sourcedata[i];
            temp.children.clear();
            targetdata.push_back(temp);
            tree_to_array(targetdata, sourcedata[i].children, sourcedata[i].id);
          }
          else
          {
            targetdata.push_back(sourcedata[i]);
          }
        }
      }
    }
    复制代码

     

    这样给前端api多爽,前端也不用自己处理,每次提交整个树过来就可以了,看完是不是明白了,主要是控制id 和 parentid

    更多paozhu有趣特性 以后一一介绍。

    ✅ 1. 自带json编解码不用第三方库,标准json支持
    ✅ 2. 支持多域名网站
    ✅ 3. 支持多域名ssl 服务端
    ✅ 4. 支持http/1.1、http/2协议
    ✅ 5. 支持websocket服务端
    ✅ 6. 框架自带websocket推送,支持定时推送到webscoket客户端
    ✅ 7. 支持同步httpclient get post
    ✅ 8. 框架自带ORM,使用链接池方式,目前支持mysql
    ✅ 9. 框架自带线程池,和用户代码运行的线程池
    ✅10. 框架使用asio自带的协程
    ✅11. 框架特色是I/O 使用协程池 用户代码运行使用线程池,类似GO那种调度,只是针对http请求调度
    ✅12. 框架支持普通文件gzip、br,并支持缓存到磁盘,下次不用cpu再压缩
    ✅13. 框架解析URL和POST,解析结果类似PHP GET POST方式获取内容
    ✅14. 自带sendmail类库
    ✅15. 生成二维码(qrcode),需要gd、qrencode库
    ✅16. 插件化编程,热动态更新,使用动态库方式
    ✅17. 框架内置通用数据缓存模块,ORM结果缓存,提高并发能力
    ✅18. 框架controller目录注解功能,方便添加URL路由映射,降低入门心智
    ✅19. 结构和类注解JSON功能,使用json_encode json_decode操作

     

    https://github.com/hggq/paozhu

     

  • 相关阅读:
    vim习惯养成记
    图的应用4.0-----关键路径(AOE网)
    JS,事件试题,在实践中应用,非常详细!!
    Linux之父一语成谶:Valve拯救桌面版Linux,但新版本仍在分裂其生态
    STM32解析航模遥控器的PPM信号
    17-spring aop调用过程概述
    C++【特殊类的设计】【单例设计模式】
    opencv学习笔记二——图像基本操作
    如何找到一个靠谱的开发平台?看看低代码老厂商
    WordPress、Typecho 站点如何让 CloudFlare 缓存加速
  • 原文地址:https://www.cnblogs.com/paozhu/p/17350533.html