【C++ Primer】第十六章 string類和標準模板庫

來源:互聯網
上載者:User

一,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)為何使用迭代器

              模板使得演算法獨立於儲存的資料類型,而迭代器使演算法獨立於使用的容器類型

              











           

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.