【C++八股文】數據結構篇

一、單例模式優化實現

原代碼問題分析
  1. ?內存序重排序風險?:雙重檢查鎖在C++中可能因指令重排導致半初始化對象被訪問
  2. ?鎖粒度過大?:每次獲取實例都需要加鎖,影響性能
  3. ?線程安全性不足?:未考慮C++11前的內存模型問題
改進方案(C++11標準實現)
class Singleton {
public:static Singleton& getInstance() {static Singleton instance;  // C++11保證線程安全初始化return instance;}
private:Singleton() = default;~Singleton() = default;Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;
};

技術要點?:

  • 利用局部靜態變量實現線程安全初始化(Meyers Singleton)
  • 禁用拷貝構造和賦值操作
  • 自動內存管理,無需手動釋放

二、排序算法深度解析

1. 快速排序優化版
void quick_sort(int arr[], int l, int r) {if (l >= r) return;int pivot = arr[(l + r) / 2];  // 三數取中優化int i = l - 1, j = r + 1;while (i < j) {do i++; while (arr[i] < pivot);do j--; while (arr[j] > pivot);if (i < j) swap(arr[i], arr[j]);}quick_sort(arr, l, j);quick_sort(arr, j + 1, r);
}

優化點?:

  • 三數取中法選擇基準值
  • 循環展開減少分支預測失敗
2. 歸并排序改進
void merge_sort(int arr[], int l, int r) {if (l >= r) return;int mid = l + (r - l) / 2;merge_sort(arr, l, mid);merge_sort(arr, mid + 1, r);vector<int> tmp(r - l + 1);int i = l, j = mid + 1, k = 0;while (i <= mid && j <= r) tmp[k++] = (arr[i] < arr[j]) ? arr[i++] : arr[j++];while (i <= mid) tmp[k++] = arr[i++];while (j <= r) tmp[k++] = arr[j++];copy(tmp.begin(), tmp.end(), arr + l);
}

改進點?:

  • 使用vector臨時存儲避免全局數組
  • 尾遞歸優化減少棧空間消耗

三、KMP算法原理與實現

算法核心
  1. ?前綴函數構建?:
vector<int> computeLPS(const string& p) {int n = p.size();vector<int> lps(n, 0);for (int i = 1, len = 0; i < n; ) {if (p[i] == p[len]) lps[i++] = ++len;else if (len) len = lps[len-1];else lps[i++] = 0;}return lps;
}

?2.?匹配過程?:?

void kmp(const string& text, const string& pattern) {auto lps = computeLPS(pattern);int i = 0, j = 0;while (i < text.size()) {if (text[i] == pattern[j]) {i++; j++;if (j == pattern.size()) {cout << "Found at " << i - j << endl;j = lps[j-1];}} else if (j) j = lps[j-1];else i++;}
}

技術優勢?:

  • 線性時間復雜度O(n+m)
  • 避免主串回溯

四、LRU緩存機制實現

數據結構設計
class LRUCache {struct Node {int key, val;Node* prev, *next;Node(int k, int v) : key(k), val(v), prev(nullptr), next(nullptr) {}};
public:LRUCache(int capacity) : cap(capacity) {head = new Node(-1, -1);tail = new Node(-1, -1);head->next = tail;tail->prev = head;}int get(int key) {if (cache.count(key)) {auto node = cache[key];moveToHead(node);return node->val;}return -1;}void put(int key, int val) {if (cache.count(key)) {auto node = cache[key];node->val = val;moveToHead(node);} else {if (cache.size() == cap) {auto last = tail->prev;removeNode(last);cache.erase(last->key);delete last;}auto newNode = new Node(key, val);addToHead(newNode);cache[key] = newNode;}}
private:unordered_map<int, Node*> cache;Node* head, *tail;int cap;void addToHead(Node* node) { /*...*/ }void removeNode(Node* node) { /*...*/ }void moveToHead(Node* node) { /*...*/ }
};

實現要點?:

  • 雙向鏈表維護訪問順序
  • 哈希表實現O(1)查找
  • 虛擬頭尾節點簡化邊界處理

五、字符串類安全實現

class SafeString {
public:SafeString(const char* str = "") {size_ = strlen(str);data_ = new char[size_ + 1];strncpy(data_, str, size_);data_[size_] = '\0';}SafeString(const SafeString& other) {size_ = other.size_;data_ = new char[size_ + 1];strcpy(data_, other.data_);}SafeString& operator=(const SafeString& other) {if (this != &other) {delete[] data_;size_ = other.size_;data_ = new char[size_ + 1];strcpy(data_, other.data_);}return *this;}~SafeString() { delete[] data_; }char& operator[](size_t index) {if (index >= size_) throw out_of_range("");return data_[index];}
private:char* data_;size_t size_;
};

安全改進?:

  • 深拷貝避免淺拷貝問題
  • 邊界檢查防止越界訪問
  • RAII內存管理

六、智能指針實現優化

template<typename T>
class SharedPtr {struct ControlBlock {size_t count;T* ptr;ControlBlock(T* p) : ptr(p), count(1) {}};
public:explicit SharedPtr(T* ptr = nullptr) : control_(ptr ? new ControlBlock(ptr) : nullptr) {}SharedPtr(const SharedPtr& other) : control_(other.control_) {if (control_) ++control_->count;}SharedPtr& operator=(const SharedPtr& other) {if (this != &other) {release();control_ = other.control_;if (control_) ++control_->count;}return *this;}~SharedPtr() { release(); }T* get() const { return control_ ? control_->ptr : nullptr; }size_t use_count() const { return control_ ? control_->count : 0; }
private:void release() {if (control_ && --control_->count == 0) {delete control_->ptr;delete control_;}}ControlBlock* control_;
};

關鍵改進?:

  • 控制塊獨立管理引用計數
  • 線程安全需增加原子操作
  • 支持自定義刪除器

>>>C/C++入門及練手項目<<<

七、其他重要知識點補充

  1. ?main前執行函數?:

class Initializer {
public:Initializer() { /* main前執行代碼 */ }
};
static Initializer init;

利用靜態對象構造順序特性[用戶代碼正確]

?2.管道通信優化?:

int pipefd[2];
if (pipe(pipefd) == -1) handle_error();
pid_t pid = fork();
if (pid == 0) { close(pipefd[1]);  // 子進程關閉寫端//... 
} else {close(pipefd[0]);  // 父進程關閉讀端//...
}

增加錯誤處理和資源管理[用戶代碼正確]

3.?rand7生成rand10優化?:

int rand10() {int a = rand7(), b = rand7();int num = (a-1)*7 + b;  // 1-49均勻分布return (num <= 40) ? (num % 10 + 1) : rand10();  // 拒絕采樣
}

八、技術對比與選型建議

數據結構/算法時間復雜度空間復雜度適用場景優化方向
快速排序O(n log n)O(log n)隨機數據三數取中+尾遞歸優化
歸并排序O(n log n)O(n)鏈表/大文件自底向上迭代實現
LRU緩存O(1)O(capacity)熱點數據多級緩存+預加載
KMP算法O(n+m)O(m)字符串匹配BM算法替代

?完整C++后端八股文:>> C++八股文(完整版)<<

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/95281.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/95281.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/95281.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

并發編程——15 線程池ForkJoinPool實戰及其工作原理分析

1 一道算法題引發的思考及其實現 1.1 算法題 問&#xff1a;如何充分利用多核 CPU 的性能&#xff0c;快速對一個2千萬大小的數組進行排序&#xff1f; 這道題可以通過歸并排序來解決&#xff1b; 1.2 什么是歸并排序&#xff1f; 歸并排序&#xff08;Merge Sort&#xff…

Kafka面試精講 Day 6:Kafka日志存儲結構與索引機制

【Kafka面試精講 Day 6】Kafka日志存儲結構與索引機制 在“Kafka面試精講”系列的第6天&#xff0c;我們將深入剖析 Kafka的日志存儲結構與索引機制。這是Kafka高性能、高吞吐量背后的核心設計之一&#xff0c;也是中高級面試中的高頻考點。面試官常通過這個問題考察候選人是否…

Linux 字符設備驅動框架學習記錄(三)

Linux字符設備驅動開發新框架詳解 一、新舊驅動框架對比 傳統字符設備驅動流程 手動分配設備號 (register_chrdev_region)實現file_operations結構體使用mknod手動創建設備節點 新式驅動框架優勢 自動設備號分配&#xff1a;動態申請避免沖突自動節點創建&#xff1a;通過class…

《計算機網絡安全》實驗報告一 現代網絡安全挑戰 拒絕服務與分布式拒絕服務攻擊的演變與防御策略(1)

目 錄 摘 要 一、研究背景與目的 1.1 介紹拒絕服務&#xff08;DoS&#xff09;和分布式拒絕服務&#xff08;DDoS&#xff09;攻擊的背景 &#xff08;1&#xff09;拒絕服務攻擊&#xff08;DoS&#xff09;  &#xff08;2&#xff09;分布式拒絕服務攻擊&#xff0…

深度學習篇---模型組成部分

模型組成部分&#xff1a;在 PyTorch 框架下進行圖像分類任務時&#xff0c;深度學習代碼通常由幾個核心部分組成。這些部分中有些可以在不同網絡間復用&#xff0c;有些則需要根據具體任務或網絡結構進行修改。下面我將用通俗易懂的方式介紹這些組成部分&#xff1a;1. 數據準…

關于ANDROUD APPIUM安裝細則

1&#xff0c;可以先參考一下連接 PythonAppium自動化完整教程_appium python教程-CSDN博客 2&#xff0c;appium 需要對應的版本的node&#xff0c;可以用nvm對node 進行版本隔離 3&#xff0c;對應需要安裝android stuido 和對應的sdk &#xff0c;按照以上連接進行下載安…

八、算法設計與分析

1 算法設計與分析的基本概念 1.1 算法 定義 &#xff1a;算法是對特定問題求解步驟的一種描述&#xff0c;是有限指令序列&#xff0c;每條指令表示一個或多個操作。特性 &#xff1a; 有窮性&#xff1a;算法需在有限步驟和時間內結束。確定性&#xff1a;指令無歧義&#xff…

機器學習從入門到精通 - 神經網絡入門:從感知機到反向傳播數學揭秘

機器學習從入門到精通 - 神經網絡入門&#xff1a;從感知機到反向傳播數學揭秘開場白&#xff1a;點燃你的好奇心 各位&#xff0c;有沒有覺得那些能識圖、懂人話、下棋碾壓人類的AI特別酷&#xff1f;它們的"大腦"核心&#xff0c;很多時候就是神經網絡&#xff01;…

神經網絡模型介紹

如果你用過人臉識別解鎖手機、刷到過精準推送的短視頻&#xff0c;或是體驗過 AI 聊天機器人&#xff0c;那么你已經在和神經網絡打交道了。作為深度學習的核心技術&#xff0c;神經網絡模仿人腦的信息處理方式&#xff0c;讓機器擁有了 “學習” 的能力。一、什么是神經網絡&a…

蘋果開發中什么是Storyboard?object-c 和swiftui 以及Storyboard到底有什么關系以及邏輯?優雅草卓伊凡

蘋果開發中什么是Storyboard&#xff1f;object-c 和swiftui 以及Storyboard到底有什么關系以及邏輯&#xff1f;優雅草卓伊凡引言由于最近有個客戶咨詢關于 蘋果內購 in-purchase 的問題做了付費咨詢處理&#xff0c;得到問題&#xff1a;“昨天試著把您的那幾部分code 組裝成…

孩子玩手機都近視了,怎樣限制小孩的手機使用時長?

最近兩周&#xff0c;我給孩子檢查作業時發現娃總是把眼睛瞇成一條縫&#xff0c;而且每隔幾分鐘就會用手背揉眼睛&#xff0c;有時候揉得眼圈都紅了。有一次默寫單詞&#xff0c;他把 “太陽” 寫成了 “大陽”&#xff0c;我給他指出來&#xff0c;他卻盯著本子說 “沒有錯”…

醫療AI時代的生物醫學Go編程:高性能計算與精準醫療的案例分析(六)

第五章 案例三:GoEHRStream - 實時電子病歷數據流處理系統 5.1 案例背景與需求分析 5.1.1 電子病歷數據流處理概述 電子健康記錄(Electronic Health Record, EHR)系統是現代醫療信息化的核心,存儲了患者從出生到死亡的完整健康信息,包括 demographics、診斷、用藥、手術、…

GEM5學習(2):運行x86Demo示例

創建腳本 配置腳本內容參考官網的說明gem5: Creating a simple configuration script 首先根據官方說明創建腳本文件 mkdir configs/tutorial/part1/ touch configs/tutorial/part1/simple.py simple.py 中的內容如下&#xff1a; from gem5.prebuilt.demo.x86_demo_board…

通過 FinalShell 訪問服務器并運行 GUI 程序,提示 “Cannot connect to X server“ 的解決方法

FinalShell 是一個 SSH 客戶端&#xff0c;默認情況下 不支持 X11 圖形轉發&#xff08;不像 ssh -X 或 ssh -Y&#xff09;&#xff0c;所以直接運行 GUI 程序&#xff08;如 Qt、GNOME、Matplotlib 等&#xff09;會報錯&#xff1a; Error: Cant open display: Failed to c…

1.人工智能——概述

應用領域 替代低端勞動&#xff0c;解決危險、高體力精力損耗領域 什么是智能制造&#xff1f;數字孿生&#xff1f;邊緣計算&#xff1f; 邊緣計算 是 數字孿生 的 “感官和神經末梢”&#xff0c;負責采集本地實時數據和即時反應。瑣碎數據不上傳總服務器&#xff0c;實時進行…

傳統園區能源轉型破局之道:智慧能源管理系統驅動的“源-網-荷-儲”協同賦能

傳統園區能源結構轉型 政策要求&#xff1a;福建提出2025年可再生能源滲透率≥25%&#xff0c;山東強調“源網荷儲一體化”&#xff0c;安徽要求清潔能源就地消納。系統解決方案&#xff1a;多能協同調控&#xff1a;集成光伏、儲能、充電樁數據&#xff0c;通過AI算法動態優化…

[光學原理與應用-353]:ZEMAX - 設置 - 可視化工具:2D視圖、3D視圖、實體模型三者的區別,以及如何設置光線的數量

在光學設計軟件ZEMAX中&#xff0c;2D視圖、3D視圖和實體模型是三種不同的可視化工具&#xff0c;分別用于從不同維度展示光學系統的結構、布局和物理特性。它們的核心區別體現在維度、功能、應用場景及信息呈現方式上&#xff0c;以下是詳細對比&#xff1a;一、維度與信息呈現…

《sklearn機器學習》——交叉驗證迭代器

sklearn 交叉驗證迭代器 在 scikit-learn (sklearn) 中&#xff0c;交叉驗證迭代器&#xff08;Cross-Validation Iterators&#xff09;是一組用于生成訓練集和驗證集索引的工具。它們是 model_selection 模塊的核心組件&#xff0c;決定了數據如何被分割&#xff0c;從而支持…

Trae+Chrome MCP Server 讓AI接管你的瀏覽器

一、核心優勢1、無縫集成現有瀏覽器環境直接復用用戶已打開的 Chrome 瀏覽器&#xff0c;保留所有登錄狀態、書簽、擴展及歷史記錄&#xff0c;無需重新登錄或配置環境。對比傳統工具&#xff08;如 Playwright&#xff09;需獨立啟動瀏覽器進程且無法保留用戶環境&#xff0c;…

Shell 編程 —— 正則表達式與文本處理器

目錄 一. 正則表達式 1.1 定義 1.2 用途 1.3 Linux 正則表達式分類 1.4 正則表達式組成 &#xff08;1&#xff09;普通字符 &#xff08;2&#xff09;元字符&#xff1a;規則的核心載體 &#xff08;3&#xff09; 重復次數 &#xff08;4&#xff09;兩類正則的核心…