以前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 ...