国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【c++】string類的使用

這篇具有很好參考價值的文章主要介紹了【c++】string類的使用。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

目錄

一、標(biāo)準(zhǔn)庫中的string類

1、簡單介紹string類

2、string類的常用接口注意事項(xiàng)

2.1、string類對象的常用構(gòu)造

2.2、string類對象的容量操作

2.3、string類對象的訪問及遍歷操作

2.4、string類對象的修改操作

二、string類的模擬實(shí)現(xiàn)


一、標(biāo)準(zhǔn)庫中的string類

1、簡單介紹string類

? ? ? ? (1)string是表示字符串的字符串類;

? ? ? ? (2)string類的接口與常規(guī)容器的接口基本相同,在添加了一些專門用來操作string的常規(guī)操作;

? ? ? ? (3)string的底層實(shí)際是:basic_string模板類的別名,typedef basic_string<char,char_traits,allocator> string;

? ? ? ? (4)不能操作多字節(jié)或者變長字符的序列。

2、string類的常用接口注意事項(xiàng)

2.1、string類對象的常用構(gòu)造

? ? ? ? 標(biāo)準(zhǔn)庫給出的string類對象常用的構(gòu)造函數(shù)有很多,我們經(jīng)常用到的主流構(gòu)造方式有三種:用模板提供的默認(rèn)構(gòu)造函數(shù)構(gòu)造空的string類對象、用常量字符串構(gòu)造string類對象以及用現(xiàn)有的string類對象進(jìn)行拷貝構(gòu)造string類對象。

【c++】string類的使用,c++,開發(fā)語言

2.2、string類對象的容量操作

【c++】string類的使用,c++,開發(fā)語言

? ? ? ? (1)size()與length()方法的底層實(shí)現(xiàn)原理完全相同,引入size()的原因是為了與其他容器的接口保持一致,一般情況先都是用size()。

? ? ? ? (2)clear()只是將string類對象中的有效字符清空,不改變底層空間大小。

? ? ? ? (3)resize(size_t n)與resize(size_t n,char c)都是將字符串中的有效字符個數(shù)改變成n個,不同的是當(dāng)字符個數(shù)增多時:resize(n)用0來填充多出來的元素空間,resize(size_t n,char c)是用字符c來填充多出來的元素空間。注意:resize()在改變元素個數(shù)時,如果是將元素個數(shù)增多,可能會改變底層容量的大小,如果是將元素個數(shù)減少,底層空間的總大小保持不變,并不會隨著元素個數(shù)的減少而縮小容量空間。

? ? ? ? (4)reserve(size_t res_arg=0):為string預(yù)留空間,不改變有效元素個數(shù),當(dāng)reserve的參數(shù)小于string的底層空間總大小時,reserve不會改變?nèi)萘康拇笮 ?/p>

2.3、string類對象的訪問及遍歷操作

? ? ? ? string類對象的訪問方式有三種:下標(biāo)訪問、迭代器訪問、范圍for訪問。這里主要討論迭代器訪問方式。

? ? ? ? 迭代器是一個類,現(xiàn)階段可以把迭代器當(dāng)成一個指針來使用(實(shí)際上不一定是指針),迭代器是在類的里邊定義的,即內(nèi)部類,使用方式如:string::iterator。string類中與迭代器搭配使用的成員函數(shù)包括begin()、end()、rbegin()、rend()。

【c++】string類的使用,c++,開發(fā)語言

2.4、string類對象的修改操作

【c++】string類的使用,c++,開發(fā)語言

? ? ? ? string類提供了很多字符串修改接口,需要說的是:在string尾部追加自字符時,s.push_back(c)/s.append(1,c)/s+='c'三種實(shí)現(xiàn)方式幾乎一樣,一般情況下更多的選用+=操作,+=操作不僅可以連接單個字符,還可以連接字符串;對string操作時,如果能夠大概預(yù)估到待存儲字符串的長度,可以先通過reserve把空間預(yù)留好。文章來源地址http://www.zghlxwxcb.cn/news/detail-791186.html

二、string類的模擬實(shí)現(xiàn)

#pragma once
#include<iostream>
using namespace std;
#include<assert.h>

namespace lbj
{
    class string
    {
        friend ostream& operator<<(ostream& _cout, const string& s);
        friend istream& operator>>(istream& _cin, string& s);
        typedef char* iterator;
    public:
        string(const char* str = "")
        {
            _size = strlen(str);
            _capacity = _size;
            _str = new char[_capacity + 1];
            strcpy(_str, str);
        }
        string(const string& s) : _str(nullptr), _size(0), _capacity(0)
        {
            string tmp(s._str);
            this->swap(tmp);
        }
        string& operator=(const string& s)
        {
            if (this != &s)
            {
                string temp(s);
                this->swap(temp);
            }
            return *this;
        }
        ~string()
        {
            if (_str)
            {
                delete[] _str;
                _str = nullptr;
            }
        }

        //

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


        /

        // modify
        void push_back(char c)
        {
            if (_size == _capacity)
                reserve(_capacity * 2);
            _str[_size++] = c;
            _str[_size] = '\0';
        }
        string& operator+=(char c)
        {   
            push_back(c);
            return *this;
        }
        void append(const char* str)
        {
            int len = strlen(str);
            if (_size + len > _capacity)
            {
                reserve(_size + len);
                //_capacity = _size + len;
            }
            strcpy(_str + _size, str);   //strcpy()會將‘\0’也拷貝過來,所以不需要手動添加'\0'
            _size += len;
        }
        string& operator+=(const char* str)
        {
            append(str);
            return *this;
        }
        void clear()
        {
            _size = 0;
            _str[_size] = '\0';
        }

        void swap(string& s)
        {
            std::swap(_str, s._str);
            std::swap(_size, s._size);
            std::swap(_capacity, s._capacity);
        }

        const char* C_Str()const
        {
            return _str;
        }



        /

        // capacity
        size_t size()const
        {
            return _size;
        }

        size_t capacity()const
        {
            return _capacity;
        }

        bool empty()const
        {
            return _size == 0;
        }

        void resize(size_t newSize, char c = '\0')
        {
            if (newSize > _size)
            {
                // 如果newSize大于底層空間大小,則需要重新開辟空間
                if (newSize > _capacity)
                {
                    reserve(newSize);
                }
                memset(_str + _size, c, newSize - _size);
            }
            _size = newSize;
            _str[newSize] = '\0';
        }

        void reserve(size_t newCapacity)
        {
            // 如果新容量大于舊容量,則開辟空間
            if (newCapacity > _capacity)
            {
                char* str = new char[newCapacity + 1];
                strcpy(str, _str);
                // 釋放原來舊空間,然后使用新空間
                delete[] _str;
                _str = str;
                _capacity = newCapacity;
            }
        }



        /

        // access
        char& operator[](size_t index)
        {
            assert(index < _size);
            return _str[index];
        }

        const char& operator[](size_t index)const
        {
            assert(index < _size);
            return _str[index];
        }



        /

        //relational operators
        bool operator<(const string& s)const
        {
            int res = strcmp(_str, s._str);
            if (res < 0)
                return true;
            return false;
        }

        bool operator<=(const string& s)const
        {
            return !(*this > s);
        }

        bool operator>(const string& s)const
        {
            int res = strcmp(_str, s._str);
            if (res > 0)
                return true;
            return false;
        }

        bool operator>=(const string& s)const
        {
            return !(*this < s);
        }

        bool operator==(const string& s)const
        {
            int res = strcmp(_str, s._str);
            if (res == 0)
                return true;
            return false;
        }

        bool operator!=(const string& s)const
        {
            return !(*this == s);
        }



        // 返回c在string中第一次出現(xiàn)的位置
        size_t find(char c, size_t pos = 0) const
        {
            for (size_t i = pos; i < _size; ++i)
            {
                if (_str[i] == c)
                    return i;//找到,返回下標(biāo)
            }
            return -1;//未找到
        }

        // 返回子串s在string中第一次出現(xiàn)的位置
        size_t find(const char* s, size_t pos = 0) const
        {
            assert(s);
            assert(pos < _size);
            const char* src = _str + pos;
            while (*src)
            {
                const char* match = s;//如果不匹配,返回子串起始處重新查找
                const char* cur = src;
                while (*match && *match == *cur)//結(jié)束條件
                {
                    ++match;
                    ++cur;
                }
                if (*match == '\0')//找到子串
                {
                    return src - _str;//返回下標(biāo)
                }
                else
                {
                    ++src;
                }
            }
            return -1;//未找到
        }

        // 在pos位置上插入字符c/字符串str,并返回該字符的位置
        string& insert(size_t pos, char c)
        {
            assert(pos <= _size);
            if (_size > _capacity)
            {
                //擴(kuò)容
                char* newstr = new char[_capacity * 2 + 1];//開空間
                strcpy(newstr, _str);
                delete[] _str;
                _str = newstr;
                _capacity *= 2;
                //Expand(_capacity * 2);
            }

            //移數(shù)據(jù)
            for (int i = _size; i >= (int)pos; --i)
            {
                _str[i + 1] = _str[i];
            }
            _str[pos] = c;
            _size++;
            return *this;
        }

        string& insert(size_t pos, const char* str)
        {
            size_t len = strlen(str);
            if (_size + len > _capacity)//擴(kuò)容
            {
                //擴(kuò)容
                char* newstr = new char[_capacity * 2 + 1];//開空間
                strcpy(newstr, _str);
                delete[] _str;
                _str = newstr;
                _capacity *= 2;
                //Expand(_size + len);
            }

            //后移數(shù)據(jù)
            for (int i = _size; i >= (int)pos; --i)
            {
                _str[len + i] = _str[i];
            }

            //拷貝字符串
            while (*str != '\0')
            {
                _str[pos++] = *str++;
            }
            _size += len;
            return *this;
        }

        // 刪除pos位置上的元素,并返回該元素的下一個位置
        string& erase(size_t pos, size_t len)
        {
            assert(pos < _size);
            if (pos + len >= _size)//pos位置之后全為0
            {
                _str[pos] = '\0';
                _size = pos;
            }
            else
            {
                strcpy(_str + pos, _str + pos + len);
                _size -= len;
            }
            return *this;
        }

    private:
        char* _str;
        size_t _capacity;
        size_t _size;
    };

    //輸入流重載
    istream& operator>>(istream& _cin, string& s)
    {
        //預(yù)分配100個空間
        char* str = (char*)malloc(sizeof(char) * 100);
        char* buf = str;
        int i = 1;
        //預(yù)處理:跳過流里面的所有空格和回車
        while ((*buf = getchar()) == ' ' || (*buf == '\n'));
        for (; ; ++i)
        {
            if (*buf == '\n') //回車跳出
            {
                *buf = '\0';
                break;
            }
            else if (*buf == ' ') //空格跳出
            {
                *buf = '\0';
                break;
            }
            else if (i % 100 == 0) //空間不足
            {
                i += 100; //追加100個空間
                str = (char*)realloc(str, i);
            }
            else  //每次getchar()一個值
            {
                buf = (str + i);//為了避免realloc返回首地址改變,不使用++buf,而是用str加上偏移.
                //每次讀取一個字符
                *buf = getchar();
            }
        }
        //輸入完成,更新s
        s._str = str;
        s._capacity = s._size = i;
        return _cin;
    }

    //輸出流重載
    ostream& operator<<(ostream& _cout, const string& s)
    {
        for (size_t i = 0; i < s.size(); ++i)
        {
            _cout << s[i];
        }
        return _cout;
    }
};

到了這里,關(guān)于【c++】string類的使用的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【C++】string類的基礎(chǔ)操作

    【C++】string類的基礎(chǔ)操作

    ??個人主頁?? ?個人專欄——C++學(xué)習(xí)? ??點(diǎn)擊關(guān)注??一起學(xué)習(xí)C語言???? 目錄 導(dǎo)讀 1. 基本概述 2.?string類對象的常見構(gòu)造 3.?string類對象的容量操作 4. string類對象的訪問及遍歷操作 5. 迭代器 6. string類對象的修改操作 6.1 基本修改操作 6.2 c_str()函數(shù) 6.3 find + npos、rfind和

    2024年03月11日
    瀏覽(26)
  • 【C++】string類的模擬實(shí)現(xiàn)

    【C++】string類的模擬實(shí)現(xiàn)

    前言:在上一篇中我們講到了string類的使用方法,今天我們將進(jìn)一步的去學(xué)習(xí)string類,去底層看看它順帶模擬實(shí)現(xiàn)部分的內(nèi)容。 ?? 博主CSDN主頁:衛(wèi)衛(wèi)衛(wèi)的個人主頁 ?? ?? 專欄分類:高質(zhì)量C++學(xué)習(xí) ?? ??代碼倉庫:衛(wèi)衛(wèi)周大胖的學(xué)習(xí)日記?? ??關(guān)注博主和博主一起學(xué)習(xí)!一起努

    2024年03月21日
    瀏覽(22)
  • 【C++】string類的深入介紹

    【C++】string類的深入介紹

    作者:愛寫代碼的剛子 時間:2023.5.26 本篇博客主要深入介紹string類、string類的常用接口及操作,string中迭代器的使用,以及string中的部分方法。(由于篇幅有限,剩余方法以及string的深淺拷貝將在之后的博客介紹) 前言:C語言中,字符串是以’\\0’結(jié)尾的一些字符的集合,

    2024年02月08日
    瀏覽(26)
  • C++中string類的常用函數(shù)

    C++中string類的常用函數(shù)

    引言:在C語言中對于字符串的一些操作,例如在字符串末尾增加字符,對字符串拷貝等,我們可以通過調(diào)用庫中函數(shù)來完成這些操作,在C++中,我們把這些常規(guī)操作封裝成了string類,可以通過類對象直接調(diào)用這些函數(shù),使得更加符合了面向?qū)ο蟮乃枷搿?作用:返回字符串的有效字符長度

    2024年02月08日
    瀏覽(25)
  • 【C++】string類的深淺拷貝問題

    【C++】string類的深淺拷貝問題

    我們知道,定義一個類的時候,如果我們沒有寫構(gòu)造,拷貝構(gòu)造,賦值運(yùn)算符重載,析構(gòu)方法的話,編譯器會自動生成。當(dāng)該類成員中涉及到資源的管理時,實(shí)現(xiàn)的就是淺拷貝。所以,以上這幾種方式是必須要程序猿手動實(shí)現(xiàn)的。 舉例來看: 圖中所示:實(shí)現(xiàn)了構(gòu)造和析構(gòu),

    2023年04月26日
    瀏覽(23)
  • C++ 之 string類的模擬實(shí)現(xiàn)

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

    這學(xué)習(xí)我有三不學(xué) 昨天不學(xué),因?yàn)樽蛱焓莻€過去 明天不學(xué),因?yàn)槊魈爝€是個未知數(shù) 今天不學(xué),因?yàn)槲覀円钤诋?dāng)下,我就是玩嘿嘿~ –?–?–?–?–?–?–?–?–?–?–?–?–?–?–?–?–?–?–?-正文開始-?–?–?–?–?–?–?–?–?–?–

    2024年04月27日
    瀏覽(21)
  • 【C++初階】9. string類的模擬實(shí)現(xiàn)

    【C++初階】9. string類的模擬實(shí)現(xiàn)

    string類的完整實(shí)現(xiàn)放這里啦!快來看看吧 string類的作用就是將字符串類型實(shí)現(xiàn)更多功能,運(yùn)算符重載,增刪改查等等操作,所以其成員就包含char*的字符串 在之前的學(xué)習(xí)過程中,我們了解到類中存在的六個默認(rèn)函數(shù),其中就包含默認(rèn)構(gòu)造函數(shù),那么對于string類是否需要用戶自

    2024年02月09日
    瀏覽(20)
  • 【C++初階】學(xué)習(xí)string類的模擬實(shí)現(xiàn)

    【C++初階】學(xué)習(xí)string類的模擬實(shí)現(xiàn)

    前面已經(jīng)學(xué)習(xí)了string類的用法,這篇文章將更深入的學(xué)習(xí)string類,了解string類的底層是怎么實(shí)現(xiàn)的。當(dāng)然,這里只是模擬一些常用的,不常用的可以看文檔學(xué)習(xí)。 我們一共創(chuàng)建兩個文件,一個是test.cpp文件,用于測試;另一個是string.h文件,用于聲明和定義要模擬的string類。

    2024年02月03日
    瀏覽(19)
  • 【C++】——string類的介紹及模擬實(shí)現(xiàn)

    【C++】——string類的介紹及模擬實(shí)現(xiàn)

    C語言中,字符串是以’\\0’結(jié)尾的一些字符的集合,為了操作方便,C標(biāo)準(zhǔn)庫中提供了一些str系列的庫函數(shù),但是這些庫函數(shù)與字符串是分離開的,不太符合OOP的思想,而且底層空間需要用戶自己管理,稍不留神可能還會越界訪問。所以我們今天來學(xué)習(xí)C++標(biāo)準(zhǔn)庫中的string類。

    2024年02月07日
    瀏覽(31)
  • 【C++初階】string 類的認(rèn)識與學(xué)習(xí)

    【C++初階】string 類的認(rèn)識與學(xué)習(xí)

    ? 在學(xué)習(xí)string類之前,先在這里推薦2個好用的網(wǎng)站,可以用來查閱C++的相關(guān)知識 https://cplusplus.com https://en.cppreference.com/w/ 上面的是非官方的,下面的官方的,但是個人感覺還是上面的好用。 簡單來說, string 是C++中用來管理字符串的類。 他有很多接口,大致分為: 1.string類

    2024年02月09日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包