国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

C++ string現代寫法

jerry / 3114人閱讀

摘要:宋體另一種寫法宋體對傳值操作,不傳地址,這樣對實參構不成影響,通過交換所指空間地址。楷體二現代寫法其他接口實現宋體輸入輸出宋體字符串不能通過和輸出的,而是通過調用和來操作單個字符來實現字符串的輸入輸出。

一、現代寫法實現接口
首先是拷貝構造的現代寫法的實現:

	string_str(const string_str& st)			:str(nullptr)	{			string_str tem(st.str);			swap(this->str, tem.str);

首先先把this->str置空,temp調用構造函數,用st.str初始化this->str這樣就形成一個臨時對象,通過swap 然后把this->str和tem.str互換,這樣兩個對象指向的能存空間就互換了,出了作用域tem調用析構函數就釋放了。這樣就保證拷貝構造函數成功運行。
另一種寫法:

string_str& operator=( string_str s) {	swap(this->str, s.str);						return *this;		}

對s傳值操作,不傳地址,這樣對實參構不成影響,通過swap交換所指空間地址。
operator=現代寫法

// 對比下和上面的賦值那個實現比較好?string& operator=(string s){swap(_str, s._str);return *this;}

這和拷貝構造另一種寫法類似,對s傳值操作,不傳地址,這樣對實參構不成影響,通過swap交換所指空間地址。
另一種實現方式:

/*string& operator=(const string& s){if(this != &s){string strTmp(s);swap(_str, strTmp._str);}return *this;}*/

同樣的這和拷貝構造函數第一種實現方式類似。首先先把this->str置空,temp調用構造函數,用st.str初始化this->str這樣就形成一個臨時對象,通過swap 然后把this->str和tem.str互換,這樣兩個對象指向的能存空間就互換了,出了作用域tem調用析構函數就釋放了。這樣就保證拷貝構造函數成功運行。
二、 現代寫法其他接口實現
輸入輸出:

 ostream& operator<<( string_str& str, ostream&out) {			 for (size_t i = 0; i < _size; i++) {			 				 out >> str[i];			 }			 return out;		 }		 istream& operator<<(string_str& str, istream& in) {			 str[0] = "/0";			 _size = 0;		 			 char ch;			 ch = in.get();			 while (ch != " " && ch != "/0"){				 str += ch;				 ch = in.get();			 }			 return in;		 }

字符串不能通過cout<>endl輸出的,而是通過調用 ostream& operator<<( string_str& str, ostream&out)和 istream&operator<<(string_str& str, istream& in)來操作單個字符來實現字符串的輸入輸出。
字符串的輸出實際上是對字符串中的單個字符挨個遍歷打印,
字符串的輸入是對字符插入操作,遇到空格或者回車就會結束輸入。

 istream& getline( string_str& str, istream& in) {			 str.clear();			 char ch;			 ch = in.get();			 while ( ch != "/0") {				 str += ch;				 ch = in.get();			 }			 return in;		 }

istream& getline( string_str& str, istream& in)
這個函數和operator>>底層基本相同只不過它只遇到換行結束輸入。

插入與刪除:

		 void insert(size_t pos, char ch) {			 assert(pos >= 0 && pos <= _size);			 if (_size >= _capasity) {				 size_t num = _capasity == 0 ? 4 : 2 * _capasity;				 this->reserve(num);			 }			 int p = _size-1;			/* for (size_t i = this->_size; i >= pos; i--) {				 this->str[i + 1] = this->str[i];			 }*/			 while (true) {				 this->str[p + 1] = this->str[p];				 p--;				 if (p < (int)pos) {					 break;				 }			 }			 this->_size++;			 this->str[pos] = ch;		 }		 void  insert(size_t pos,const char* str1) {			 assert(pos >= 0 && pos <= _size);			 size_t len = strlen(str1);			 if (_size + len > _capasity) {				 this->reserve(_size + len);			 }			 int p = _size - 1;			 /* for (size_t i = this->_size; i >= pos; i--) {				  this->str[i + 1] = this->str[i];			  }*/			 			 while (true) {				 this->str[p + len] = this->str[p];				 p--;				 if (p < (int)pos+len) {					 break;				 }			 }			 int j = 0;			 for (size_t i = pos; i < pos + len; i++) {				 str[i] = str1[j++];			 }			 _size += len;			 str[_size] = "/0";		 		 }

插入字符和字符串函數是函數重載,基本思想都是把pos位置到npos的字符串后移,插入字符只移動一位,而字符串姚移動len位接在在str[pos]插入ch,而字符串循環插入就行。

 void erase(size_t pos, int len = -1) {			 assert(pos < _size&& pos >= 0);						 if (len == -1|| pos + len >= _size) {				 str[pos] = "/0";				 _size = pos;			 }			 else {			/*	 int num = pos;				 while (true) {					 str[num] = str[num + len];						 num++;						 if (num + len == _size) {							 break;						 }				 				 }				 int p = _size - len;				 str[p] = "/0";				 _size = p;*/				 strcpy(str + pos, str + pos + len);				 int p = _size - len;				 str[p] = "/0";				 _size -= len;			 }		 }		 ostream& oper

字符串的刪除分為兩種情況;
1.len為npos或pos+len大于size這樣在str[pos]插入/0就行了。
2.pos+len小于等于size把str + pos + len位置的字符串考到str + pos就可以了,str[pos]插入/0就OK了。

字符串比較:

int mystring::operator>(const mystring &s){    return strcmp(p,s.p) ;}int mystring::operator<(const char*s){    return strcmp(p,s) ;}int mystring::operator<(const mystring &s){    return strcmp(p,s.p);}int mystring::operator>(const char*s){    return strcmp(p,s);}bool mystring::operator!=(const mystring &s){    if(!strcmp(p,s.p)){        return false ;    }    return true ;}bool mystring::operator!=(const char * s){    if(p==NULL){        if(len ==0)             return false ;        else{            return true ;        }    }    if(!strcmp(p,s)){        return false ;    }    else{        return true;    }}bool mystring::operator==(const mystring&s){    if(strcmp(s.p,p)==0){        return true;    }    else{        return false;    }}bool mystring::operator==(const char *s){    if(s==NULL){        if(len == 0){            return true ;        }        else{            return false ;        }    }        if(strcmp(s,p)==0){            return true ;        }        else{            return false ;        }}

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/123948.html

相關文章

  • C++入門string類常用接口函數介紹 + 進階【模擬實現string接口函數】

    摘要:目錄類對象的常見構造類對象的訪問及遍歷操作迭代器介紹類對象的修改操作深淺拷貝問題深拷貝傳統寫法深拷貝的現代寫法模擬實現構造函數拷貝構造函數交換函數拷貝賦值運算符獲取對象的成員屬性重載可讀可寫和可讀定義迭代器增容處理和函 ...

    legendaryedu 評論0 收藏0
  • [C/C++]詳解STL容器1--string的功能和模擬實現(深淺拷貝問題)

    摘要:本文介紹了類的常用接口的使用,并對其進行了模擬實現,對模擬實現中涉及到的深淺拷貝問題進行了解析。在此之前,必須提到一個經典問題。為了解決淺拷貝問題,所以中引入了深拷貝。但是實際使用中需要是第一個形參對象,才能正常使用。 本文介紹了string類的常用接口的使用,并對其進行了模擬實現,對模擬實...

    tianren124 評論0 收藏0
  • 現代編程語言的值傳遞與引用傳遞

    摘要:在很多特性是和很類似,但是在類型系統中,同時支持值類型與引用類型。 現代編程語言對于值傳遞與引用傳遞的支持程度是比較不同的 首先介紹值傳遞與引用傳遞的概念 值傳遞 將變量a傳遞到其他的函數并對其更改,不能影響a的值 引用傳遞 在其他的作用域對傳入的變量a的更改可以影響a的值 Note: ? 在這里的值的概念,對于原始類型,指的就是字面的值,如1,2,a; ? 而對于動態內存...

    wenhai.he 評論0 收藏0
  • 現代編程語言的值傳遞與引用傳遞

    摘要:在很多特性是和很類似,但是在類型系統中,同時支持值類型與引用類型。 現代編程語言對于值傳遞與引用傳遞的支持程度是比較不同的 首先介紹值傳遞與引用傳遞的概念 值傳遞 將變量a傳遞到其他的函數并對其更改,不能影響a的值 引用傳遞 在其他的作用域對傳入的變量a的更改可以影響a的值 Note: ? 在這里的值的概念,對于原始類型,指的就是字面的值,如1,2,a; ? 而對于動態內存...

    Anleb 評論0 收藏0
  • 【1】 pythonic modern c++:字符串

    摘要:我希望的是類似中文字符這樣的使用體驗。中文中文這里的遍歷就類似中文中文我們這里干的事情類似于里兩種類型的區分。 致力于在現代C++中提供Python的編程體驗。這個建立在兩個關鍵的基礎上 c++ 11/14/17 提供了從 auto 到 structure binding 的語法便利 https://ericniebler.github.io... 提供的 range 抽象 但是 ...

    scwang90 評論0 收藏0

發表評論

0條評論

jerry

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<