首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C/C++ 基礎實戰:結構體對齊、深淺拷貝、隊列封裝、字符串類實現

     編輯:關於C++

1. 結構體內存對齊規則

  • 對齊原則:成員偏移量必須是其類型大小的整數倍;結構體總大小必須是**最大成員類型大小**的整數倍。
  • 示例:
    struct A { char c; double d; char arr[9]; };
    // c: offset 0, size 1
    // d: offset 8 (對齊 8), size 8
    // arr: offset 16 (對齊 1), size 9 → 總計 24 (對齊 8 的倍數)
    sizeof(A) == 24
  • 優化技巧:按類型大小遞減排列成員,減少填充字節。

2. 深拷貝 vs 淺拷貝

淺拷貝(預設行為)

struct String { char* p; int len; };
String s1; s1.p = new char[10]; strcpy(s1.p, "hello");
String s2 = s1; // 預設複製指針值
s2.p[0] = 'H'; // s1.p[0] 也變成 'H' —— 共享內存!

深拷貝(正確做法)

String s2;
s2.len = s1.len;
s2.p = new char[s1.len];
strcpy(s2.p, s1.p); // 分配新內存並複製內容
s2.p[0] = 'H'; // s1 不受影響

三大法則

若類管理資源(動態內存、文件句柄等),必須自定義:**複製構造函數、複製賦值運算符、析構函數**(C++11 還有移動構造/賦值)。

3. 循環隊列封裝 (C 語言風格)

#define MAXN 100
typedef char DataType;
struct Queue {
    DataType data[MAXN];
    int front, rear; // front 指向隊頭,rear 指向隊尾下一位
};
void init(Queue* q) { q->front = q->rear = 0; }
bool empty(Queue* q) { return q->front == q->rear; }
bool push(Queue* q, DataType x) {
    if ((q->rear + 1) % MAXN == q->front) return false; // 滿
    q->data[q->rear] = x;
    q->rear = (q->rear + 1) % MAXN;
    return true;
}
bool pop(Queue* q, DataType* out) {
    if (empty(q)) return false;
    *out = q->data[q->front];
    q->front = (q->front + 1) % MAXN;
    return true;
}

4. 字符串類完整實現 (C++ 風格)

核心功能:動態擴容、查找/替換/插入/刪除(字符/子串)、大小寫轉換、分割/連接。

class MyString {
    char* data;
    int len, cap;
public:
    MyString(const char* s = "") { /* 複製構造 */ }
    ~MyString() { delete[] data; }
    MyString(const MyString& other) { /* 深拷貝 */ }
    MyString& operator=(const MyString& other) { /* 深拷貝賦值 */ }
    void push_back(char c) { /* 擴容邏輯 */ }
    void append(const MyString& s) { /* 擴容+拷貝 */ }
    int find(char c) const { /* 線性查找 */ }
    int find(const MyString& s) const { /* KMP 或朴素匹配 */ }
    void insert(int pos, char c) { /* 移動數據+擴容 */ }
    void erase(int pos, int count) { /* 移動數據 */ }
    void replace(char old_c, char new_c) { /* 遍歷替換 */ }
    // ... 其他工具函數
};

關鍵實現細節

  • 動態擴容:cap = max(cap*2, needed),realloc 或 new+copy+delete。
  • 插入/刪除:需移動後續字符,注意 \\0 維護。
  • 查找子串:可用 KMP (O(n+m)) 替代朴素 O(nm)。
  • 分割/連接:split(sep) 返回 vector,join(vec, sep) 反向操作。

總結

本文涵蓋 C/C++ 基礎設施構建的四大核心主題:內存佈局控制、資源管理語義、數據結構封裝、字符串處理庫。掌握這些「造輪子」能力,不僅能應對面試手寫代碼,更能深入理解 STL 容器與標準庫的底層邏輯,寫出高效、健壯的系統級代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved