面試最常問的陣列轉樹,樹轉陣列 c++ web框架paozhu實現

游水小雞發表於2023-04-24

剛畢業同學,找工作常被問 二維陣列轉樹,樹轉二維陣列 需要支援無限層級實現,如果你瞭解這個語言那麼實現起來還要一番思考

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

 

相關文章