一,string類
1)建構函式
string()
string(const char *s)
string(size_type n,char c)//包含n個元素的string 全部初始化為 c
string(const char *s,size_type n)//初始化為s指向的前n個字元
樣本:
#include <iostream>#include <string>using namespace std;int main(){string one("NEU Locate in shengyang");cout<<one<<endl;string two(20,'#');cout<<two<<endl;string three(one);cout<<three<<endl;string four;four=one+" realy?";cout<<four<<endl;char a[]="NEU is a famous school ";string five(a,3);cout<<five<<endl;string six(a+4,a+15);cout<<six<<endl;string seven(&a[4],&a[15]);cout<<seven<<endl; }
2)string類輸入
C-風格字串輸入:
char info[100];cin>>info;cin.getline(info,100);cin.get(info,100);
C++風格輸入:
string stuff;cin>>stuff;cin.getline(stuff,100);
兩個版本的getline 都有一個共同選擇性參數,getline(stuff,';');//結束邊界
string 的getline()函數從輸入中讀取字元,並將其儲存到string中,直到發生下列3中:遇到檔案結尾、遇到分節符號(\n)、讀取字元數到達最大
3)使用string
size_type find(string _Ch, size_type _Off = 0) const; // 從_Off開始尋找_Ch,返回index。
size_type find(const char * _Ptr,size_type _Off = 0) const; // 從_Off開始尋找_Ptr
size_type find(const char * _Ptr, size_type _Off,size_type _Count) const; // 從_Off開始尋找_Ptr的前_Count個子串,有意義嗎?
size_type find(const basic_string<CharType, Traits, Allocator>& _Str,size_type _Off = 0) const; // 從_Off開始尋找_Str
樣本:
#include <iostream>#include <string>using namespace std;#define Print( exp )\ /*這裡的分行符號('\')值得注意 #也值得注意*/{\string::size_type pos = exp; \if( pos != string::npos ) \ cout<< #exp <<"="<< pos << endl;\else\ cout<< #exp <<"= 找不到" << endl;\}int main( ) {string ss( "Hello World!_Hello World!" );cout<< ss <<endl;Print( ss.find('o') ); // 直接尋找oPrint( ss.find('o', 5 ) ); // 從開始尋找oPrint( ss.find("He") );Print( ss.find("He",10) );Print( ss.find("Hello_") );Print( ss.find("Hello_",0,5 ) ); // 注意這個和上面的區別Print( ss.find("Hello_",1,5 ) );cout<<endl;string res("World");cout<< res <<endl;Print( ss.find( res,3 ) );return 0;}
4)string 還提供了哪些功能
自動調整大小:string增加字元,是不是僅僅將已有字元加大,但相鄰記憶體有可能被佔用。從新分配一個新記憶體,將原來內容複寫到新記憶體,但是頻繁的這樣操作效率會很低。C++如何做呢? 分配一個比實際字串大的記憶體塊,為字串提供增大空間。如果字串不斷增大,超過記憶體塊,程式分配一個為原來兩倍的新記憶體。
樣本:
#include <iostream>#include <string>using namespace std;int main(){string empty;string small="bit";string larger="Elephants are a gril's best friend";cout<<"Size:\n";cout<<"\t empty:"<<empty.size()<<endl;cout<<"\t small:"<<small.size()<<endl;cout<<"\t larger:"<<larger.size()<<endl;cout<<"Capacities:\n";cout<<"\t empty:"<<empty.capacity()<<endl;cout<<"\t small:"<<small.capacity()<<endl;cout<<"\t larger:"<<larger.capacity()<<endl;empty.reserve(50);//reserve 讓您能夠請求記憶體塊的最小長度cout<<"Capacity after empty.reserve(50):"<<empty.capacity()<<endl; return 0;}
使用C-Free實驗結果
不知道為什麼跟書上結果不一樣???等待答案……
二,auto_ptr類
1)模板類,動態指派至以及當對象不再需要時自動執行清理
2)void remodel(string &str)
{
string *ps=new string(str);
str = ps;
delete ps;
return;
}
三,STL Standard Template Library,標準模板庫
1)簡介:STL是一些“容器”的集合,這些“容器”有list,vector,set,map等,STL也是演算法和其他一些組件的集合。這裡的“容器”和演算法的集合指的是世界上很多聰明人很多年的傑作。STL的目的是標準化組件,這樣就不用重新開發,可以使用現成的組件。STL現在是C++的一部分,因此不用額外安裝什麼.
2)vector(向量)之所以被認為是一個容器,是因為它能夠像容器一樣存放各種類型的對象,簡單地說,vector是一個能夠存放任意類型的動態數組,能夠增加和壓縮資料
樣本:
#include <iostream>#include <string>#include <vector>using namespace std;const int NUM = 5;int main(){vector<int> ratings(NUM);vector<string> titles(NUM);int a[NUM]={2,3,4,5,6};string b[NUM]={"AA","BB","CC","DD","EE"};for(int i=0;i<NUM;++i){ratings[i]=a[i];titles[i]=b[i];}for(int j=0;j<NUM;++j){cout<<ratings[j]<<"\t"<<titles[j]<<endl;//cout<<ratings.at(j)<<"\t"<<titles.at(j)<<endl;//另一種表達方式}return 0;}
3)迭代器(iterator)是一種對象,它能夠用來遍曆標準模板庫容器中的部分或全部元素,每個迭代器對象代表容器中的確定的地址。迭代器修改了常規指標的介面,所謂迭代器是一種概念上的抽象:那些行為上象迭代器的東西都可以叫做迭代器
迭代器提供一些基本操作符:*、++、==、!=、=。
#include <iostream>#include <string>#include <vector>using namespace std;const int NUM = 5;int main(){vector<int> ratings(NUM);vector<int>::iterator pd; pd=ratings.begin(); *pd=5; cout<<*pd<<endl; int a[NUM]={2,3,4,5,6}; for(int i=0;i<NUM;++i){ratings[i]=a[i];} for(pd=ratings.begin();pd!=ratings.end();pd++){cout<<*pd<<endl;} return 0;}
四,通用編程技術
物件導向編程關注的是編程的資料方面,而通用編程技術關注的是演算法。
通用程式工具:模板、迭代器
1)為何使用迭代器
模板使得演算法獨立於儲存的資料類型,而迭代器使演算法獨立於使用的容器類型