### C++ sort 的底層原理
這里其實原來問的是你如何優化快速排序,但是我最初只以為是隨機選擇基準,但是很顯然面試官對此并不滿意
閑暇之際,看到一篇介紹sort的原理的文章,才知道原來如是也
1.快速排序:作為主要算法,它通過選擇一個pivot元素,將序列劃分為兩個子序列,一個子序列元素小于樞軸,另一個大于,隨后遞歸排序,時間復雜度達到O(nlogn).
2.堆排序:為了避免快速排序在最壞情況下O(n^2)的最壞情況,當快速排序遞歸深度超過一定限制的時候,sort迅速切換到堆排序
3.插入排序:當處理小規模的子序列的時候,使用插入排序的性能更好
### 請介紹一下epoll,poll,select
select、poll 和 epoll 是三種Linux下實現 ??I/O 多路復用
I/O多路復用指的是用一個線程監控多個文件描述符的動態變化
select(相當于逐個點名):每次調用,都需要告知內核需要監控哪些文件描述符,內核進行標記,然后返回就緒的數量,用戶自己還需要再遍歷一次
poll(改進版逐一點名):相對于select使用vector來存儲監控的文件描述符,使得容量無限制
epoll(事件通知):當有文件描述符需要服務的時候,才會通知,且返回的為需要服務的文件描述符,避免遍歷
這里肯定就會有朋友問了,有了epoll還要poll干嘛:為了非Linux下使用
這里補充一下loop,綁定器和回調函數
loop:事件循環:??事件循環??是一個持續運行的循環結構,負責監聽和分發事件。它通過 ??非阻塞?? 的方式處理多個任務,避免因等待某個操作(如文件讀取)而阻塞整個程序。
? 一般流程為循環開始 → 檢查是否有事件 → 處理事件 → 等待新事件 → 循環繼續
? note:上述三種select等是用于監聽,后面這些是處理這些事件的流程
綁定器:綁定器??用于將一個函數與特定的參數或上下文綁定,生成一個新的函數。通過占位符給函數一個固定的參數
回調函數:允許程序在等待耗時操作時不阻塞主線程。當某一事件發生時進行調用,
### 迭代器失效的場景
vector,這個容器為動態數組,相信學過操作系統分區分配的朋友一定知道,我如果在連續的存儲空間中擴容的做法為再找一片空間,當前內容復制過去,再插入
那么由于迭代器(類似于指針),你地址都變了,我肯定失效了
deque(雙端隊列):底層為分段連續的數組,插入會導致全部迭代器失效,規則復雜,這里不做贅述,自行了解
map/set/multimap/multiset:底層是紅黑樹,后面我會在數據結構章節介紹這種結構,插入刪除不會失效
unordered_map/unordered_set(哈希表):插入如果導致擴容,迭代器失效
note:刪除操作肯定會導致當前迭代器失效,這很容易理解