c++之STL模板,vector與string


一,vector

  名字:向量,本質:數組,存在意義:解決動態數組問題,我們知道c++的數組定義,一定要確定具體的大小,因為這個涉及到內存的分配,確定小了,又不夠用,太大又浪費,所以推出了動態的確定素組的大小,

  原理:先分配一個N大小的數組,然后對該向量進行操作,如果不斷插入,而空間不能滿足需要,則會自動重新申請一個更大的空間,把原來的值復制過去,然后刪除掉原來的空間,這樣就達到了動態修訂數組大小的目的;

  底層結構:

 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僅僅表示下標,而非存入數據)

功能

  構造:vector<T> p;       默認構造,構造一個空的向量,然后向里面添加數值,注意因為是空的,所以不能通過[]訪問;

      p(n):         默認構造一個大小為n的向量,可以初始里面的數值全為0,或者其他,因為已經存在,所以可以直接使用[]訪問;

      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的歸並也很像;

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM