c++之STL模板,vector與string

一,vectorc++

  名字:向量,本質:數組,存在乎義:解決動態數組問題,咱們知道c++的數組定義,必定要肯定具體的大小,由於這個涉及到內存的分配,肯定小了,又不夠用,太大又浪費,因此推出了動態的肯定素組的大小,數組

  原理:先分配一個N大小的數組,而後對該向量進行操做,若是不斷插入,而空間不能知足須要,則會自動從新申請一個更大的空間,把原來的值複製過去,而後刪除掉原來的空間,這樣就達到了動態修訂數組大小的目的;數據結構

  底層結構:app

 0:M_start指針, M_finish指針 1   2   3   4    5   6   7  M_end指針->

    初始化的時候,分配一個N大小的,而後start指針和finish指針都指向第一個結點,而end指向最後一個結點的下一個結點地址;這樣,若是遍歷到了end就說明這個向量結束了,而finish是指向的最後一個數據的指針,好比說,插入三個數據,那麼數據就插入到finish的位置,隨之finish+3;(圖中數字1~7僅僅表示下標,而非存入數據)spa

功能指針

  構造:vector<T> p;       默認構造,構造一個空的向量,而後向裏面添加數值,注意由於是空的,因此不能經過[]訪問;code

      p(n):         默認構造一個大小爲n的向量,能夠初始裏面的數值全爲0,或者其餘,由於已經存在,因此能夠直接使用[]訪問;blog

      p(t.begin(),t.end());  默認把數據t範圍內的數據所有導入到向量p中,好比map,list,普通數組等等,均可以使用這個功能轉化數據結構;接口

using namespace std; int main() { vector<int> p1; //第一種 vector<int> p2(10,1); //第二種 cout << p2[5] << endl; p2[3] = 10; vector<int> p3(p2.begin()+3, p2.end()); //第三種 cout << p3[0] << endl; system("pause"); return 0; }
//打印結果 1 10;
 

  增長:insert()         選定壓入的位置指針(而不是下標!),與數據,好比說 p.insert(p.begin()+1,33) 把數據33壓入到第二個位置(記住,數組無論是插仍是輸,都是直接使用指針,而不是值),那麼後面的數據就會所有move,向後面移動,耗時比較慢!內存

      push_back()  將數據壓入到最後面,尾部。

using namespace std; int main() { vector<int> p2(10,1); cout << p2.size() << endl; p2.insert(p2.begin() + 3, 100); p2.push_back(10); cout << p2[3] << endl; cout << p2.size() << endl; system("pause"); return 0; }
//結果 10 100 12

  刪除: erase()    指定要刪除的指針位置,刪除後,又會發生移動,比較慢

       pop_back() 刪除最後一個元素

       clear()刪除所有內容

  

using namespace std; int main() { vector<int> p2(10,1); cout << p2.size() << endl; p2.erase(p2.begin() + 1); p2.pop_back(); cout << p2.size() << endl; system("pause"); return 0; } //結果10 8

 

  遍歷:p[] 最簡單的,咱們知道[]至關於 *(p+i)的意思,那麼直接使用下標訪問也能夠,從0到p.size(),注意越界問題;

     begin(),end() 也可使用迭代器訪問;

using namespace std; int main() { vector<int> p2(10,1); for (int i = 0; i < p2.size(); i++) cout << " " << p2[i]; cout << endl; for (auto it = p2.begin(); it != p2.end(); it++) cout << " " << *it; system("pause"); return 0; } //結果 1 1 1 1 1 1 1 1 1

 

  特殊:front(): 返回第一個元素的值    back():返回最後一個元素的值;

     size():返回該向量的有效大小  empty():返回這個向量是否爲空,爲空返回的是1,不要搞反了!  reserve()從新設置向量的大小;

  由於這個是普通數組,查找速度很慢,因此,沒有提供查找find()方法;

二,string

 原理:使用的底層和vector相同,因此放在一塊兒,字符char類陳,字符串=字符組,char[],以'/0'結尾,而string就是封裝了這個數據結構,增長了不少實用的接口,好比說增刪查改等等;原理和vector同樣,就很少說直接跳入功能部分

 功能

    構造: string s1=" ";最經常使用的構造方式;

    插入: append(4,'a');在字符串的末尾添加4個a,注意!若是標註了多少個,那麼後面就要使用單一的字符

       append("aa");若是是字符串「 」那麼就不須要標註重複多少個!

       push_back():與前面都同樣,不經常使用;一樣只能放出單一的字符,而不是字符串!

      +:最經常使用,重載後的+,s=s1+s2;

  

using namespace std; int main() { string s1 = "1231234"; cout << s1 << endl; s1.append(3, '0'); cout << s1 << endl; s1.append("999"); cout << s1 << endl; s1.push_back('a'); cout << s1 << endl; string s2 = "ttt"; string s = s1 + s2; cout << s << endl; system("pause"); return 0; } /*結果:1231234 1231234000 1231234000999 1231234000999a 1231234000999attt*/

 

    刪除: erase(4);從下標4開始,包括下標4,後面的所有刪除了

       erase(4,2);從下標4開始,包括下標4,刪除兩個符號

 

using namespace std; int main() { string s1 = "1231234"; s1.erase(4,1); cout << s1 << endl; s1.erase(4); cout << s1 << endl; system("pause"); return 0; }/* 123134 1231*/

 

    修改: substr(4,2);提取字符串內的子字符串,返回的是提取出來的值,而原字符串不會發生改變,能夠和earse()配套使用;

 

int main() { string s1 = "1231234"; string s2 = s1.substr(4, 2); cout << s1 << " " << s2 << endl; system("pause"); return 0; } 結果:1231234 23

 

    查找: find("aa")   返回發現「aa"的第一個下標,默認從0開始遍歷,一下全都同樣,若是沒有找到,都是返回-1.

        find(1,"aa")從1開始遍歷,從1開始,返回找到的第一個下標。

       find_first_of():找到一個值,返回該值的下標。

       find_last_of():倒着開始找,找到了返回該值的下標。

 

int main() { string s1 = "1231234"; cout << s1.find('1') << endl; cout << s1.find('5') << endl; cout << s1.find_first_of('2') << endl; cout << s1.find_last_of('2') << endl; system("pause"); return 0; } 結果:0 -1 1 4

 

    替換: replace(),與substr()很像,與list的歸併也很像;

相關文章
相關標籤/搜索