1. 程式人生 > >關於C++的STL的學習與再認識(一)

關於C++的STL的學習與再認識(一)

以前學習c++的時候,對比較基礎的兩點有一定的害怕,就是涉及指標的部分和STL。雖然一直在指標方面下功夫學習,也寫過文章記錄心得,希望以後碰到指標的問題能夠解決。至於STL,在之前對基本的演算法有了實現,想對STL有一個較深的認識,寫下文章記錄學習過程。

STL:標準模板庫(Standard Template Library—STL)

容器

用途:操作大量資料是會某種用到容器。c語言只有一種內建容器,陣列。
因為陣列的功能有限,所以為這個容器開發出介面,對任何資料型別都能夠使用,這就是STL的思想。

vector

最簡單的STL的容器,其實就是一個擁有擴充套件功能的陣列。
唯一一個向後相容c程式碼的容器(實際上就是陣列)

vector<int> v(10);
    for (int i = 0; i < 10; i++)
    {
        v[i] = i * i;
    }

注意下面兩者的差異:

vertor<int>  v[10];
vertor<int>  v(10);

前者聲明瞭一個存有10個vertor<int>型別元素的陣列,初始化為空。
大部分情況下我們用的是後者,宣告一個大小為10的陣列。
獲取容器大小:int number = v.size():返回無符號值
判斷一個容器時候為空時,常用的empty()函式:

bool
is_nonempty_notgood = (v.size() >= 0); // Try to avoid this bool is_nonempty_ok = !v.empty();

這是因為size()函式對vertor的元素計數,不是所有容器都能在常量時間內返回自己的大小,而且你絕不應該為了確定連結串列中至少包含一個節點元素就對一條雙鏈表中的所有元素計數。

    vector<int> v(10);
    for (int i = 0; i < 10; i++)
    {
        v[i] = i * i;
    }
    v.resize(15
); for (int i = 0; i < 5; i++) { v.push_back(100); } cout << v.size() << endl; //20 for (int i = 0; i < v.size(); i++) { cout << v[i] << " "; } //20 //0 1 4 9 16 25 36 49 64 81 0 0 0 0 0 100 100 100 100 100 100

1.push_back()函式:向vertor尾部新增一個元素,容器長度加1。每次用push_back()新增新元素時,vertor分配的記憶體空間總是比實際需要的多,因此不用擔心記憶體分配問題。
2.resize()函式:重新改變vertor的大小。若改變後小於當前大小,則多餘的元素被刪除;若大於當前,以0填充新元素。
注意:使用resize()後用push_back()的元素,並不是位於新分配的記憶體中,而是在新分配分寸的後面。上面例子,vertor的大小為10,改變後為15,push_back()後的元素放在了15–20的位置處。且size為20.
3.clear()用來清空vertor,是vertor包含0個元素。(刪除所有元素,變為空容器)

初始化verotr:

vector<int> v2 = v;
print(v2);

vector<int> v3(v);
print(v3);

上面兩種初始化方式得到的結果與v一樣。
若是其他型別:vertor<string> s(20, "sunwen").
多維陣列:最常見的就是二維陣列,建立一個儲存vertor元素的vertor。

print(vector<int>(n, 10)); //10 10 10 10 10
vector< vector<int> > f(n, vector<int>(m, 10));

上述程式碼先是初始化了一個一維陣列。接著初始化了二位陣列f,是一個n*m的矩陣,所有元素用10填充。

當vertor用作引數時,實際上是複製了這個vertor(值傳遞)。避免浪費大量時間和記憶體,永遠不要這樣寫:
void print(vector<int> v)
應該使用下面的方法:
void print(const vector<int>& v)
如果需要在函式中改變vertor的值,去掉const修飾符。