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

打印 上一主题 下一主题

主题 955|帖子 955|积分 2865

刚毕业同学,找工作常被问 二维数组转树,树转二维数组 需要支持无限层级实现,如果你了解这个语言那么实现起来还要一番思考
c++ web框架 paozhu使用 需要实现数据库表数据到前台菜单实现,就是这种功能 二维数组转树,树转二维数组 保存时候树二维数组,展示时候树树状。
这个技术难点在于无限递归,这个树程序基本原理
现在看看c++怎么实现的,无限递归,家肯定是考虑到结构体 嵌套自己定义。
  1. struct department_outjson_t
  2. {
  3.   unsigned int id          = 0;
  4.   unsigned int parentid    = 0;
  5.   bool isopen              = true;
  6.   bool _is_use             = false;
  7.   std::string title;
  8.   std::string desc;
  9.   std::vector<department_outjson_t> children;
  10. };
复制代码
  1. department_outjson_t 就是结构体 嵌套定义<br>我们看看怎么实现的,先上代码,使用了模板<br><br>
复制代码
  1. template <typename deps_json_type>
  2. concept ishas_isuse_member = requires(deps_json_type m) { m._is_use; };
  3. template <typename deps_json_type>
  4.   requires ishas_isuse_member<deps_json_type>
  5. void array_to_tree(std::vector<deps_json_type> &targetdata,
  6.                    std::vector<deps_json_type> &sourcedata)
  7. {
  8.   if (targetdata.size() == 0)
  9.   {
  10.     for (unsigned int i = 0; i < sourcedata.size(); i++)
  11.     {
  12.       if (sourcedata[i].parentid == 0)
  13.       {
  14.         targetdata.push_back(sourcedata[i]);
  15.         sourcedata[i]._is_use = true;
  16.       }
  17.     }
  18.   }
  19.   for (unsigned int i = 0; i < sourcedata.size(); i++)
  20.   {
  21.     if (sourcedata[i]._is_use == false)
  22.     {
  23.       for (unsigned int j = 0; j < targetdata.size(); j++)
  24.       {
  25.         if (targetdata[j].id == sourcedata[i].parentid)
  26.         {
  27.           targetdata[j].children.push_back(sourcedata[i]);
  28.           sourcedata[i]._is_use = true;
  29.           array_to_tree(targetdata[j].children, sourcedata);
  30.         }
  31.       }
  32.     }
  33.   }
  34. }
复制代码
 
就是这样可以实现了,注意是使用了扫描,怕影响性能,我用一个变量标注,当然也可以用保存地址方式。
 
顺便把 树转二维数组也实现了
  1. template <typename deps_json_type>
  2. void tree_to_array(std::vector<deps_json_type> &targetdata,
  3.                    std::vector<deps_json_type> &sourcedata,
  4.                    unsigned int parendid = 0)
  5. {
  6.   for (unsigned int i = 0; i < sourcedata.size(); i++)
  7.   {
  8.     if (sourcedata[i].parentid == parendid)
  9.     {
  10.       if (sourcedata[i].children.size() > 0)
  11.       {
  12.         deps_json_type temp = sourcedata[i];
  13.         temp.children.clear();
  14.         targetdata.push_back(temp);
  15.         tree_to_array(targetdata, sourcedata[i].children, sourcedata[i].id);
  16.       }
  17.       else
  18.       {
  19.         targetdata.push_back(sourcedata[i]);
  20.       }
  21.     }
  22.   }
  23. }
复制代码
 
这样给前端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
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

尚未崩坏

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表