最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++之string的模擬實(shí)現(xiàn)過程

 更新時(shí)間:2025年06月03日 10:55:51   作者:zzh_zao  
這篇文章主要介紹了C++之string的模擬實(shí)現(xiàn)過程,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

手寫C++字符串類

從零實(shí)現(xiàn)一個(gè)簡易版std::string

類的基本結(jié)構(gòu)與成員變量

namespace zzh {
class string {
private:
    char* _str;        // 存儲字符串的字符數(shù)組
    size_t _size;      // 當(dāng)前字符串長度
    size_t _capacity;  // 已分配的容量
public:
    static const size_t npos;  // 表示"不存在的位置"
    // 各類成員函數(shù)...
};
}

這個(gè)自定義字符串類主要通過動態(tài)分配的字符數(shù)組_str來存儲字符串內(nèi)容,并維護(hù)兩個(gè)重要狀態(tài):_size表示當(dāng)前字符串長度,_capacity表示已分配的內(nèi)存容量。

1.基本成員變量

在自定義 string 類中,我們需要定義一些基本的成員變量來存儲字符串的內(nèi)容和相關(guān)信息:

  • _str:用于存儲字符串的字符數(shù)組,通常是一個(gè)動態(tài)分配的 char 類型數(shù)組。
  • _size:表示當(dāng)前字符串的實(shí)際長度,不包括結(jié)尾的空字符 \0。
  • _capacity:表示分配的內(nèi)存容量,通常大于或等于 _size,用于優(yōu)化內(nèi)存分配效率。

2.構(gòu)造函數(shù)和析構(gòu)函數(shù)

構(gòu)造函數(shù)用于初始化 string 對象,常見的構(gòu)造方式包括:

  • 從 C 風(fēng)格字符串構(gòu)造(const char*):通過 strlen 計(jì)算字符串長度,并動態(tài)分配內(nèi)存來存儲字符串內(nèi)容。
  • 拷貝構(gòu)造函數(shù):用于從另一個(gè) string 對象構(gòu)造新對象,需要深拷貝內(nèi)存以避免懸掛指針問題。
  • 默認(rèn)構(gòu)造函數(shù):用于創(chuàng)建一個(gè)空字符串。
  • 析構(gòu)函數(shù)則負(fù)責(zé)釋放動態(tài)分配的內(nèi)存,避免內(nèi)存泄漏。

3.賦值運(yùn)算符重載

  • 為了支持對象之間的賦值操作,我們需要重載賦值運(yùn)算符 =。
  • 在實(shí)現(xiàn)時(shí),需要注意自賦值的情況,并進(jìn)行深拷貝以確保兩個(gè)對象的內(nèi)存獨(dú)立。

4.內(nèi)存管理

  • 字符串操作中,內(nèi)存管理是一個(gè)關(guān)鍵問題。
  • 我們需要在字符串長度超過當(dāng)前容量時(shí)動態(tài)擴(kuò)展內(nèi)存。
  • 通常的做法是將容量加倍,以減少頻繁的內(nèi)存分配操作。

5.迭代器支持

  • 為了方便遍歷字符串中的字符,我們可以提供迭代器支持。
  • 通過定義 begin() 和 end() 方法,返回指向字符串首尾的指針,可以方便地使用標(biāo)準(zhǔn)庫算法。

6.常見操作實(shí)現(xiàn)

追加字符或字符串:通過 push_back 和 append 方法,可以在字符串末尾添加字符或另一個(gè)字符串的內(nèi)容。在實(shí)現(xiàn)時(shí),需要注意內(nèi)存容量是否足夠,并在必要時(shí)進(jìn)行擴(kuò)展。

  • 查找和替換:提供 find 方法用于查找字符或子字符串的位置,insert 和 erase 方法用于插入和刪除字符或子字符串。
  • 比較操作:重載比較運(yùn)算符(如 <、>、== 等),以便可以直接比較兩個(gè) string 對象的大小。

一、構(gòu)造函數(shù)與析構(gòu)函數(shù)

// 1. 從C風(fēng)格字符串構(gòu)造
string::string(const char* str)
{
    _size = strlen(str);
    _str = new char[_size + 1];
    _capacity = _size;
    memcpy(_str, str, _size + 1);
}

// 2. 拷貝構(gòu)造函數(shù)
string::string(const string& s)
{
    _size = s._size;
    _capacity = s._capacity;
    _str = new char[_capacity + 1];
    memcpy(_str, s._str, _size + 1);
}

// 3. 析構(gòu)函數(shù)
string::~string()
{
    delete[] _str;
    _str = nullptr;
    _size = 0;
    _capacity = 0;
}

關(guān)鍵點(diǎn)

  • 構(gòu)造函數(shù)負(fù)責(zé)分配內(nèi)存并復(fù)制字符串內(nèi)容
  • 拷貝構(gòu)造函數(shù)實(shí)現(xiàn)深拷貝,避免內(nèi)存共享
  • 析構(gòu)函數(shù)必須釋放動態(tài)分配的內(nèi)存,防止內(nèi)存泄漏

二、賦值運(yùn)算符重載

string& string::operator=(const string& s)
{
    if (this != &s)
    {
        char* tmp = new char[s._capacity + 1];
        memcpy(tmp, s._str, s._size + 1);
        delete[] _str;  // 注意:原代碼此處順序有誤,已修正
        _str = tmp;
        _size = s._size;
        _capacity = s._capacity;
    }
    return *this;
}

技術(shù)要點(diǎn)

  • 使用臨時(shí)變量確保異常安全
  • 自我賦值檢查避免無效操作
  • 先分配新內(nèi)存再釋放舊內(nèi)存,防止內(nèi)存泄漏

三、迭代器支持

string::iterator string::begin() { return _str; }
string::iterator string::end() { return _str + _size; }

說明

  • 迭代器本質(zhì)是字符指針
  • begin()返回字符串首地址
  • end()返回字符串末尾的下一個(gè)位置

四、內(nèi)存管理與擴(kuò)容機(jī)制

// 預(yù)分配內(nèi)存
void string::reserve(size_t n)
{
    if (n > _capacity)
    {
        char* tmp = new char[n + 1];
        memcpy(tmp, _str, _size + 1);
        delete[] _str;
        _str = tmp;
        _capacity = n;
    }
}

// 追加字符
void string::push_back(char c)
{
    if (_size >= _capacity)
    {
        size_t newcapacity = _capacity == 0 ? 4 : 2 * _capacity;
        reserve(newcapacity);
    }
    _str[_size++] = c;  // 注意:原代碼此處錯誤地寫入了固定字符'c'
    _str[_size] = '\0';
}

內(nèi)存管理策略

  • 采用指數(shù)級擴(kuò)容(2倍)減少內(nèi)存分配次數(shù)
  • reserve()實(shí)現(xiàn)預(yù)分配,避免頻繁擴(kuò)容
  • 每次擴(kuò)容后保留額外空間,提高插入效率

五、字符串操作函數(shù)

// 追加C風(fēng)格字符串
void string::append(const char* str)
{
    size_t len = strlen(str);
    if (_size + len > _capacity)
    {
        size_t newcapacity = 2 * _capacity > _size + len ? 2 * _capacity : _size + len;
        reserve(newcapacity);
    }
    memcpy(_str + _size, str, len);  // 注意:原代碼此處多復(fù)制了一個(gè)終止符
    _size += len;
    _str[_size] = '\0';  // 手動添加終止符
}

// 查找字符
size_t string::find(char c, size_t pos = 0) const
{
    for (size_t i = pos; i < _size; i++)
    {
        if (_str[i] == c)
            return i;
    }
    return npos;
}

// 插入字符
string& string::insert(size_t pos, char c)
{
    assert(pos <= _size);
    if (_size >= _capacity)
    {
        size_t newcapacity = _capacity == 0 ? 4 : 2 * _capacity;
        reserve(newcapacity);
    }
    // 從后向前移動元素
    for (size_t i = _size; i > pos; i--)
        _str[i] = _str[i - 1];
    _str[pos] = c;
    _size++;
    return *this;
}

核心算法

  • append()通過內(nèi)存拷貝實(shí)現(xiàn)高效追加
  • find()線性查找目標(biāo)字符
  • insert()通過元素后移實(shí)現(xiàn)插入操作
  • 使用memmove()處理內(nèi)存重疊情況

六、運(yùn)算符重載

// 比較運(yùn)算符
bool string::operator<(const string& s)
{
    size_t i1 = 0, i2 = 0;
    while (i1 < _size && i2 < s._size)
    {
        if (_str[i1] < s._str[i2])
            return true;
        else if (_str[i1] > s._str[i2])
            return false;
        i1++; i2++;
    }
    return i1 < s._size;  // 注意:原代碼此處邏輯有誤,已修正
}

// 索引運(yùn)算符
char& string::operator[](size_t index)
{
    assert(index < _size);
    return _str[index];
}

實(shí)現(xiàn)要點(diǎn)

  • 比較運(yùn)算符按字典序逐字符比較
  • 索引運(yùn)算符提供隨機(jī)訪問能力
  • 提供常量和非常量兩個(gè)版本的重載

總結(jié)

通過手寫這個(gè)簡易版string類,我們深入理解了標(biāo)準(zhǔn)庫字符串類的核心機(jī)制:動態(tài)內(nèi)存管理、深拷貝實(shí)現(xiàn)、迭代器設(shè)計(jì)、擴(kuò)容策略等。

雖然現(xiàn)代C++編程中應(yīng)優(yōu)先使用std::string,但掌握這些底層原理有助于寫出更高效、更安全的代碼。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++實(shí)現(xiàn)猜數(shù)游戲

    C++實(shí)現(xiàn)猜數(shù)游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)猜數(shù)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C++十六進(jìn)制宏的用法詳解

    C++十六進(jìn)制宏的用法詳解

    C++十六進(jìn)制宏的用法;本文將詳細(xì)介紹
    2012-11-11
  • C語言字符函數(shù)與字符串函數(shù)詳解

    C語言字符函數(shù)與字符串函數(shù)詳解

    這篇文章主要給大家介紹了關(guān)于C語言字符/字符串的相關(guān)函數(shù),文中通過示例代碼總結(jié)的非常詳細(xì),對大家學(xué)習(xí)或者使用C語言具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-09-09
  • 基于C語言實(shí)現(xiàn)五子棋游戲完整實(shí)例代碼

    基于C語言實(shí)現(xiàn)五子棋游戲完整實(shí)例代碼

    這篇文章主要介紹了基于C語言實(shí)現(xiàn)五子棋游戲完整實(shí)例代碼,相信對于學(xué)習(xí)游戲開發(fā)的朋友會有一定的幫助與借鑒價(jià)值,需要的朋友可以參考下
    2014-08-08
  • 詳解C++編程中標(biāo)記語句與復(fù)合語句的寫法

    詳解C++編程中標(biāo)記語句與復(fù)合語句的寫法

    這篇文章主要介紹了C++編程中標(biāo)記語句與復(fù)合語句的寫法,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2016-01-01
  • Visual Studio 2019安裝使用C語言程序(VS2019 C語言)

    Visual Studio 2019安裝使用C語言程序(VS2019 C語言)

    這篇文章主要介紹了Visual Studio 2019安裝使用C語言程序,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • C/C++內(nèi)存泄漏原因分析與應(yīng)對方法

    C/C++內(nèi)存泄漏原因分析與應(yīng)對方法

    內(nèi)存泄漏會導(dǎo)致當(dāng)前應(yīng)用程序消耗更多的內(nèi)存,使得其他應(yīng)用程序可用的內(nèi)存更少了,那么為什么會內(nèi)存泄漏,我們應(yīng)該怎樣應(yīng)對內(nèi)存泄漏,所以接下來就給大家詳細(xì)介紹一下C++內(nèi)存泄漏原因分析與應(yīng)對方法,需要的朋友可以參考下
    2023-07-07
  • C++實(shí)現(xiàn)雙向起泡排序算法

    C++實(shí)現(xiàn)雙向起泡排序算法

    這篇文章主要為大家詳細(xì)介紹了如何利用C++實(shí)現(xiàn)雙向起泡排序算法,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以嘗試一下
    2022-11-11
  • 在iOS中給視頻添加濾鏡的方法示例

    在iOS中給視頻添加濾鏡的方法示例

    這篇文章主要介紹了在iOS中給視頻添加濾鏡的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • C語言近萬字為你講透棧和隊(duì)列

    C語言近萬字為你講透棧和隊(duì)列

    對于線性表,我們可能要執(zhí)行下列操作:訪問表的第k個(gè)結(jié)點(diǎn)、在k這個(gè)結(jié)點(diǎn)之前或者之后插入一個(gè)新結(jié)點(diǎn),抑或是刪除第k個(gè)結(jié)點(diǎn)等等操作,其中我們會遇到值對第一個(gè)或者最后一個(gè)結(jié)點(diǎn)插入、刪除、和訪問值的線性表,我們給它們以特殊的名稱:棧、隊(duì)列、雙端隊(duì)列
    2022-05-05

最新評論

福海县| 小金县| 昆明市| 顺平县| 文水县| 慈溪市| 冀州市| 周至县| 宁阳县| 崇义县| 五峰| 黄大仙区| 阳曲县| 类乌齐县| 麦盖提县| 乌拉特后旗| 图片| 安顺市| 平度市| 马公市| 大冶市| 得荣县| 油尖旺区| 象山县| 忻州市| 贺州市| 天水市| 烟台市| 塘沽区| 新和县| 鄢陵县| 新密市| 进贤县| 滦南县| 虞城县| 乌鲁木齐县| 峨山| 宁乡县| 丽水市| SHOW| 吉首市|