面试最常问的数组转树,树转数组 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<department_outjson_t> children;

};
department_outjson_t 就是结构体 嵌套定义
我们看看怎么实现的,先上代码,使用了模板

template <typename deps_json_type>
concept ishas_isuse_member = requires(deps_json_type m) { m._is_use; };

template <typename deps_json_type>
  requires ishas_isuse_member<deps_json_type>
void array_to_tree(std::vector<deps_json_type> &targetdata,
                   std::vector<deps_json_type> &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 <typename deps_json_type>
void tree_to_array(std::vector<deps_json_type> &targetdata,
                   std::vector<deps_json_type> &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

 

原文链接:https://www.cnblogs.com/paozhu/p/17350533.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:面试最常问的数组转树,树转数组 c++ web框架paozhu实现 - Python技术站

(0)
上一篇 2023年4月25日
下一篇 2023年4月25日

相关文章

  • linux开发之gdb记录

    简述 GDB, the GNU Project debugger, allows you to see what is going on ‘inside’ another program while it executes — or what another program was doing at the moment it crashed.GDB, G…

    C++ 2023年4月17日
    00
  • 最少步数

    在各种棋中,棋子的走法总是一定的,如中国象棋中马走“日”。有一位小学生就想如果马能有两种走法将增加其趣味性,因此,他规定马既能按“日”走,也能如象一样走“田”字。他的同桌平时喜欢下围棋,知道这件事后觉得很有趣,就想试一试,在一个(100*100)的围棋盘上任选两点A、B,A点放上黑子,B点放上白子,代表两匹马。棋子可以按“日”字走,也可以按“田”字走,俩人一…

    C++ 2023年4月25日
    00
  • C++ 入门

    001 c++ 如何工作 任何以 # 开头的语句,都是预处理语句,所谓的预处理语句,在编译之前,就已经被处理了 关键字 include:找到 <> 文件(通常称为“头文件”),然后将 <> 中的所有内容拷贝到现在的文件里 main()比较特殊,虽然它的返回值类型是 int,但它不一定需要返回值,如果不设置返回值,默认返回 0 <…

    C++ 2023年5月11日
    00
  • 2023.5.5 面向对象程序设计实验报告

    实验项目名称:模板 一、实验目的 1、熟练掌握函数模板和类模板的定义格式。 2、熟练运用函数模板和类模板解决实际问题。 二、实验内容 1、复数类Complex有两个数据成员:a和b, 分别代表复数的实部和虚部,并有若干构造函数和一个重载-(减号,用于计算两个复数的距离)的成员函数。 要求设计一个函数模板 template < class T > …

    C++ 2023年5月5日
    00
  • P6818 [PA2013]Działka 题解

    P6818 [PA2013]Działka 前言 我太菜了。。。。 对着 jiangly 大佬的题解研究了一下午研究了一下午才搞出来(泪目。 作为一个蒟蒻,我就详细的讲一下我对与本题的理解。 题意 本题的的题意描述的还是比较明了。 在二维坐标系中,输入 \(n\) 个点 \(m\) 次询问, 每次询问,给出一个矩阵, 求出矩阵内极大凸包的面积。 题解 1.如…

    C++ 2023年4月30日
    00
  • 洛谷:P5716日份天数

    题目描述 输入年份和月份,输出这一年的这一月有多少天。需要考虑闰年。 输入格式 输入两个正整数,分别表示年份 \(y\) 和月数 \(m\),以空格隔开。 输出格式 输出一行一个正整数,表示这个月有多少天。 样例 #1 样例输入 #1 1926 8 样例输出 #1 31 样例输入 #2 2000 2 样例输出 #2 29 提示 数据保证 \(1583 \le…

    C++ 2023年4月24日
    00
  • 【Visual Leak Detector】使用注意事项

    说明 使用 VLD 内存泄漏检测工具辅助开发时整理的学习笔记。本篇介绍使用 VLD 时的注意事项。同系列文章目录可见 《内存泄漏检测工具》目录 目录 说明 1. 官网文档 2. 注意事项 1. 官网文档 可以在 Using-Visual-Leak-Detector 官方文档里看到如何使用 VLD,里面介绍了如何在 Visual C++ 2003/2005/2…

    C++ 2023年4月17日
    00
  • C语言跳转浏览器打开指定URL

    #include <stdlib.h> int main() { // 定义要打开的URL char* url = “https://rjku.gitee.io/”; // 调用系统命令以默认浏览器打开URL char command[100]; sprintf(command, “open %s”, url); system(command);…

    C++ 2023年4月27日
    00
合作推广
合作推广
分享本页
返回顶部