激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C++里一個簡單的 ::std::sort 怎么就能造成堆溢出呢?

C++里一個簡單的 ::std::sort 怎么就能造成堆溢出呢?

2021-08-30 23:51Piper蛋窩Piper蛋 C/C++

T2不就是重載一下 sort 的比較函數嗎?看坑神的b站錄象[1],再看看評論,才知道 C++ 中的一個驚天大坑。得益于4個月來對 y 總高質量代碼風格與良好書寫習慣的閱讀與模仿,我在考試時“幸運”地避開了這個坑。

C++里一個簡單的 ::std::sort 怎么就能造成堆溢出呢?

C++ 里怎么一個簡單的 ::std::sort 就能堆溢出呢?

C++里一個簡單的 ::std::sort 怎么就能造成堆溢出呢?

BV1Z64y1a7P1 坑神截圖

這周力扣周賽照例去湊熱鬧。

前兩道題很快寫完了,T3T4讀了題...嗯,不憋了,等坑神的題解吧。

午時十二點,令我十分意外地發現坑神T2竟然罰時了好多次?

T2不就是重載一下 sort 的比較函數嗎?看坑神的b站錄象[1],再看看評論,才知道 C++ 中的一個驚天大坑。得益于4個月來對 y 總高質量代碼風格與良好書寫習慣的閱讀與模仿,我在考試時“幸運”地避開了這個坑。

但還是很有必要記錄一下。

題目:找出數組中的第 K 大整數

給你一個字符串數組 nums 和一個整數 k 。nums 中的每個字符串都表示一個不含前導零的整數。

返回 nums 中表示第 k 大整數的字符串。

注意:重復的數字在統計時會視為不同元素考慮。例如,如果 nums 是 ["1","2","2"],那么 "2" 是最大的整數,"2" 是第二大的整數,"1" 是第三大的整數。

示例 1:

  1. 輸入:nums = ["3","6","7","10"], k = 4 
  2. 輸出:"3" 
  3. 解釋: 
  4. nums 中的數字按非遞減順序排列為 ["3","6","7","10"
  5. 其中第 4 大整數是 "3" 

示例 2:

  1. 輸入:nums = ["2","21","12","1"], k = 3 
  2. 輸出:"2" 
  3. 解釋: 
  4. nums 中的數字按非遞減順序排列為 ["1","2","12","21"
  5. 其中第 3 大整數是 "2" 

示例 3:

  1. 輸入:nums = ["0","0"], k = 2 
  2. 輸出:"0" 
  3. 解釋: 
  4. nums 中的數字按非遞減順序排列為 ["0","0"
  5. 其中第 2 大整數是 "0" 

提示:

  • 1 <= k <= nums.length <=
  • 1 <= nums[i].length <= 100
  • nums[i] 僅由數字組成
  • nums[i] 不含任何前導零

我的臨場作答

  1. struct Num 
  2.     string a; 
  3.      
  4.     bool operator< (const Num& t) const 
  5.     { 
  6.         if (a.size() != t.a.size()) return a.size() < t.a.size(); 
  7.         for (int i = 0; i < a.size(); ++ i) 
  8.         { 
  9.             if (a[i] != t.a[i]) return a[i] < t.a[i]; 
  10.         } 
  11.         return false
  12.     } 
  13. }; 
  14.  
  15. class Solution { 
  16. public
  17.     string kthLargestNumber(vector<string>& nums, int k) { 
  18.         vector<Num> S; 
  19.         for (auto&& t: nums) 
  20.         { 
  21.             S.push_back({t}); 
  22.         } 
  23.  
  24.         sort(S.begin(), S.end()); 
  25.         return S[S.size() - k].a; 
  26.     } 
  27. }; 

經驗:

重載 sort 中,在 operator < 或者 cmp 中 a == b 時一定也得返回 false !如果不返回 false 而是 true 將造成堆棧溢出!

  • “主要是因為如果a==b時return true的話,那么我們在a和b相等的時候,問a
  • “原來,STL中的sort并非只是普通的快速排序,除了對普通的快速排序進行優化,它還結合了插入排序和堆排序。根據不同的數量級別以及不同情況,能自動選用合適的排序方法。當數據量較大時采用快速排序,分段遞歸。一旦分段后的數據量小于某個閥值,為避免遞歸調用帶來過大的額外負荷,便會改用插入排序。而如果遞歸層次過深,有出現最壞情況的傾向,還會改用堆排序。”
  • 坑神掉進了這個坑:【算法實況】又血崩了,這種題目完全沒經驗烏烏 - 力扣周賽 - LeetCode Weekly 256[2]

此外,一些關于重載效率的對比如下:

  • 我的題解性能(struct重載operator<):執行用時 236ms 內存消耗 76.9MB
  • 力扣官方題解性能(lambda重載sort):執行用時 132ms 內存消耗 53.8MB
  • 巨佬墨染空[3]題解性能(重載sort):執行用時 592ms 內存消耗 341.7MB

代碼如下。這讓我感覺很費解。

  1. // 力扣官方題解 
  2. class Solution { 
  3. public
  4.     string kthLargestNumber(vector<string>& nums, int k) { 
  5.         nth_element(nums.begin(), nums.begin() + k - 1, nums.end(), [](const string& u, const string& v "") { 
  6.             return u.size() > v.size() || (u.size() == v.size() && u > v); 
  7.         }); 
  8.         return nums[k - 1]; 
  9.     } 
  10. }; 
  11.  
  12. // 巨佬墨染空題解 
  13. bool inline cmp(string x, string y) { 
  14.  if (x.size() != y.size()) return x.size() > y.size(); 
  15.  return x > y; 
  16.  
  17. class Solution { 
  18. public
  19.   
  20.     string kthLargestNumber(vector<string>& a, int k) { 
  21.      vector<string> s = a;  // 我將此賦值去掉,也沒有提升性能 
  22.      sort(s.begin(), s.end(), cmp); 
  23.      return s[k - 1]; 
  24.     } 
  25. }; 

參考資料

[1]坑神的b站錄象: https://www.bilibili.com/video/BV1Z64y1a7P1

[2]【算法實況】又血崩了,這種題目完全沒經驗烏烏 - 力扣周賽 - LeetCode Weekly 256: https://www.bilibili.com/video/BV1Z64y1a7P1?p=1

[3]墨染空: https://leetcode-cn.com/u/mo-ran-kong/

原文鏈接:https://mp.weixin.qq.com/s/H3CFtlZZp0hw6xjIpLB1Zg

延伸 · 閱讀

精彩推薦
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
主站蜘蛛池模板: 国产午夜亚洲精品 | 蜜桃网在线 | 精品久久一区二区三区 | 亚洲精品无码不卡在线播放he | 亚洲精品久久久久久久久久 | 一本色道久久99精品综合蜜臀 | 国产精品久久久乱弄 | 高清成人在线 | 欧美14一15sex性hd| 色妞妞视频 | 成人毛片在线免费看 | 一本色道久久综合亚洲精品小说 | 亚洲成人福利在线观看 | 午夜小影院 | 视频一区二区视频 | 成人小视频免费在线观看 | 在线a毛片免费视频观看 | 国产九色视频在线观看 | 亚洲男人的天堂在线视频 | 免费看性xxx高清视频自由 | 九色新网址 | 成年片在线观看 | 中国女人内谢69xxxx天美 | 日本免费不卡一区二区 | 精品一区二区免费视频视频 | 黄色一级片在线免费观看 | 国产手机在线视频 | 一区二区三区日韩视频在线观看 | 爽爽视频免费看 | 色播av在线| 一级片免费| 91专区在线观看 | 精品国产一区二区三 | 亚洲资源在线播放 | 国产免费一区二区三区 | 19禁国产精品福利视频 | 91色琪琪电影亚洲精品久久 | 欧美国产一区二区三区 | 曰批全过程40分钟免费视频多人 | 国产黄色网页 | 99riav国产在线观看 |