強大的STL(一)

C++提供的標準庫STL非常強大,可以這麼說,熟練掌握STL的一些算法和類的使用可以很大程度上提高編程的速度,並且使用STL一些類來編程,你可以站在更高的層次思考一個問題,這其實也等於簡化了問題的難度,想象一下如果同樣的兩位選手要修理同樣的機器,那麼攜帶了強大工具的那位選手肯定更佔優勢。  這幾天整理了一下STL中一些有用的算法和數據結構,以工具的方式寫的,在使用的時候如果有記得不是很清楚的地方可以很方便的查找。
##############################################

一 vector 使用



初始化

    vector<int> v1; 

    // ... 

    vector<int> v2 = v1; 

    vector<int> v3(v1); 



    // 構造

    vector<int> Data(1000); 

    ----------------

    vector<string> names(20, “Unknown”);    // names.size() = 20

    ----------------

    vector<int> v(3,7); 

    // ... 

    vector<int> v2(v); 

    vector<int> v3(v.begin(), v.end()); // v3 equals to v2

    vector<int> v4(v.begin(), v.begin() + (v.size()/2)); 

    vector<int> v5(v.begin()+(v.size()/2), v.end()); 

    ----------------

    int data[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31 }; 

    vector<int> primes(data, data+(sizeof(data) / sizeof(data[0])));

    ----------------

    矩陣

    int N, M; 

    // ... 

    vector< vector<int> > Matrix(N, vector<int>(M, -1)); 

    ----------------



方法

int elements_count = v.size();  // 取長度

bool is_nonempty_ok = !v.empty(); //是否爲空

v.resize(25);  // 長度重定義爲25

v.push_back(i) // 加一項

v.insert(v.begin(), 42); // 第一項插入42



// 插入一段或整個vector<T>

    vector<int> v(2,1); // {1,1}

    vector<int> v2(2,3); // {3,3}

    v.insert(v.begin(), v2.begin(), v2.end());  // {3,3,1,1}



// 擦除

v.erase(v.begin()+1); 

v.erase(v.begin(),v.end()); 

v.erase(v.begin()+2,v.begin()+4); //擦掉第2,3個



####################################################

#include <algorithm>

reverse();的使用

    ----------------

    int data1[10] = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 }; 

    reverse(data1+2, data1+6); // the range { 5, 7, 9, 11 } is now { 11, 9, 7, 5 }; 

    ----------------

    string ste[4] = {"aa","bb","cc","dd"};

    reverse(ste, ste+4);

    ----------------

    int data[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31 }; 

    vector<int> primes(data, data+(sizeof(data) / sizeof(data[0])));

    reverse(primes.begin(), primes.end());

    ----------------

    

find 的使用

返回值爲指針

    vector<int> v; 

    for(i = 1; i < 100; i++) 

        v.push_back(i*i); 

    if(vector<int>::iterator it = find(v.begin(), v.end(), 49)) { 

        if (it != v.end())

            cout << *it;

    }

    ----------------

    string ste[4] = {"aa","bb","cc","dd"};

    cout << find(ste,ste+4, "cc") - ste << endl; // 2

    

max_element()

min_element()

入參的第三個函數均是int_less(return a<b;)時,可以得到最靠前(如果是a<=b則得到相對位置靠後)的正確的最大或最小值 

    ----------------

    int data[5] = { 1, 5, 2, 4, 3 }; 

    vector<int> X(data, data+5); 

    int v1 = *max_element(X.begin(), X.end(), funmax()); // funmax的規則是x<y, max = fun(x,y)? y:x;

    int v2 = *min_element(X.begin(), X.end(), funmin()); // funmax的規則是x<y, min = fun(x,y)? x:y;

    int v3 = *max_element(data, data+5); // Returns value of max element in array 

    int i4 = min_element(data, data+5) - data; // Returns index of min element in array 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章