C 程式設計思想(第2卷)之深入探索string

2021-04-02 18:20:00 字數 2018 閱讀 5350

以前string

用的很少,一般使用

char array

或者cstring

,之所以不使用,是因為還不了解

string

的機制,不會用而並非因為

string

不好用。本文結合

string

的原始碼,深入探索

string

的用法。

那麼從構造開始:

basic_string(const e *s, const a& al = a());//

字串basic_string(const e *s, size_type n, const a& al = a());//

字串加長度

basic_string(const basic_string& rhs);//string物件

basic_string(const basic_string& rhs, size_type pos, size_type n,const a& al = a());

basic_string(size_type n, e c, const a& al = a());//

長度和字元,複製多個字元

explicit basic_string(const a& al = a());

basic_string(const_iterator first, const_iterator last,const a& al = a());

這裡面以

basic_string

的構造為主。看一下

a,其實就是記憶體分配策略。

const e*

代表的是字串,還有一些位置和長度之類的引數。

string

可以看成乙個存在

char

的vector.

string

擁有自已的

iterator,

對string

來說,iterator

就是指標。

再來看一些操作:

這是字串的增加。用法和建構函式基本上類似。

basic_string& insert(size_type p0, const e *s);

basic_string& insert(size_type p0, const e *s, size_type n);

basic_string& insert(size_type p0,const basic_string& str);

basic_string& insert(size_type p0,const basic_string& str, size_type pos,size_type n);

basic_string& insert(size_type p0, size_type n, e c);

iterator insert(iterator it, e c);

void insert(iterator it, const_iterator first, const_iterator last);

void insert(iterator it, size_type n, e c);

這裡可以選擇不同的引數,而決定不同的方式在字串中插入新的內容。

void reserve(size_type n = 0);

這個函式在

vc中好像並不管用,這讓我覺得比較鬱悶,在

linux

下用了g++

結果也不一樣,由此得到結論,不同編譯器中

string

的實現是不一樣的。

我查詢了

string

的實現,發現在

vc6上對

stl使用了一些看似巧妙的方式。

string

的實現採用了淺拷貝的方式,這並不是乙個好的方式。實踐證明這在多執行緒的程式中會出現錯誤。這以後會多一篇關於

stl_port

的string

的blog. 在

vc6中不推薦使用預設的

string

,可能有危險出現。有點虎頭蛇尾,失望!

讀書筆記之 C 程式設計思想 第2卷

c 程式設計思想 第2卷 主要是介紹的標準c 中一些比較高階的功能,包括異常處理,模板,標準庫演算法,容器,執行時型別資訊rtti。最後還包括兩部分,設計模式和併發。這兩部分是挺好的。但是,我現在對設計模式和併發也了解的不多,所以,現在是這兩部分略過先,等以後有時間再回過頭來學習設計模式和併發。第1...

C 程式設計思想 2nd卷一 模板簡介

標頭檔案 模板定義很特殊。在template 之後的任何東西都意味著編譯器在當時不為它分配儲存空間,而是一直處於等待狀態直到被乙個模板示例告知。在編譯器和聯結器中有機制能去掉同一模板的多重定義。所以為了使用方便,幾乎總是在標頭檔案中放置全部的模板宣告和定義。當建立乙個巢狀friend類的時候,必須經...

C 程式設計思想 2nd卷一 動態物件建立

當建立乙個c 物件時,會發生兩件事 1.為物件分配記憶體。2.呼叫建構函式來初始化那個記憶體。如果想對乙個void 型別指標進行delete操作,要注意這將可能成為乙個程式錯誤,除非指標所指的內容是非常簡單的,因為,它將不執行析構函式。object a new object 40,a delete ...