1. 程式人生 > >C++ vector迭代器的用法 學習筆記

C++ vector迭代器的用法 學習筆記

STL標準模板庫提供三種類型的元件:容器,迭代器和演算法,他們都支援泛型程式設計標準;

容器主要分為兩大類:順序容器和關聯容器。順序容器有:(vector, list, deque和string等)是一系列元素的有序集合。關聯容器:(set, multiset,map, multimap)包含查詢元素的鍵值;

迭代器的作用是遍歷容器;

在進行多組測試資料是一定要注意:在每組測試之後都要清空,否則容器會保留上一次測試的資料;(例最下)

Vector 使用 I:

#include <iostream>

#include <vector>  //向量需要;

#include <cstdio>

#include <numeric>  //accumulate演算法需要;

using namespace std;

int a[10005];

int main()

{

    vector <int> v;   //定義向量v;

    vector<int>::iterator it;  //定義迭代器it;

    int n;

    while(~scanf("%d", &n))

    {

        for(int i=0; i<n; i++) {  //賦值;

            scanf("%d", &a[i]);

            v.push_back(a[i]);

        }

        for(it=v.begin(); it!=v.end(); it++) {//使用iterator迭代器順序遍歷所有元素;

            printf("%d ", *it);  //輸出迭代器當前位置上的元素值;

        }

        printf("\n");

        printf("%d\n",accumulate(v.begin(), v.end(), 0));  //統計並輸出向量所有元素的和;

    }

    return 0;

}

實現斐波那契數列:

#include <iostream>

#include <vector>

using namespace std;

int main()

{

    vector <unsigned int> v;

    unsigned int n;

    v.push_back(0);

    v.push_back(1);

    for(int i=2; i<50; i++) {

        v.push_back(v[i-1]+v[i-2]);

    }

    while(cin >> n) {

        cout << v[n] << endl;

    }

    return 0;

}

//ZOJ 1179

#include <iostream>

#include <cstdio>

#include <numeric>

#include <vector>

using namespace std;

int main()

{

    vector <double> v;

    int n;

    while(~scanf("%d", &n)) {

        double m;

        v.clear();

        for(int i=0; i<n; i++) {

            scanf("%lf", &m);

            v.push_back(m);

        }

        double sum =(double)accumulate(v.begin(), v.end(), 0)/n;

        printf("%.3lf\n", sum);

    }

    return 0;

}

***建立vector物件***  

 vector 向量容器不但能像陣列一樣對元素進行隨機訪問,還能在尾部插入元素,是一種簡單,高效的容器,完全可以代替陣列;

    值得注意的是, vector容器具有自動管理的功能,對於元素的插入和刪除,可動態調整所佔的記憶體空間;使用vector向量容器,需要包含標頭檔案#include<vector>;

    vector容器的下表是從0開始計數的,也就是說,如果vector容器的大小是n, 那麼元素的下表是從0~ n-1;對於vector容器的容量定義,可以實現定義一個固定的大小,事後,可以隨時調整大小,也可以事先不定義,隨時使用push_back()方法從尾部擴張元素,也可以使用insert()在某個元素位置前插入新元素;

    vector容器有兩種重要的方法,begin() 和 end() 。begin()返回的是首元素位置的迭代器;end()返回的是最後一個元素的下一元素位置的迭代器;

***建立vector物件***

有三種形式:

(1). 不指定容器的元素個數,如定義一個用來儲存整型的容器:

      vector <int> v;

(2). 建立時,指定容器的大小,如定義一個用來儲存10個double型別元素的向量容器:

      vector <int> v(10);   //注意:元素的下標為0~9, 另外每個元素具有指定的初始值;

(3). 建立一個具有n個元素的向量容器物件,每個元素具有指定的初始值;

      vector <double> v(10, 8.6);  //定義了一個具有10個元素的向量容器,每個元素的值是8.6;

***尾部元素擴張***

***使用push_back()在尾部追加元素***// 也就是尾部元素擴張

尾部追加元素,vector容器會自動分配新記憶體空間。對空的vector物件擴張,也可對已有元素的vector物件擴張;

例:將2,7,9三個元素從尾部新增到v容器中,這樣,v容器中就有三個元素2,7,9;

#include<iostream>

#include<vector>

using namespace std;

int main(int argc,char *argv[])

{

    vector<int>v;

    v.push_back(2);

    v.push_back(7);

    v.push_back(9);

    return 0;

}

***下標方式訪問vector元素***

訪問或遍歷vector物件---對於vector物件,可以採用下標方式隨意訪問他的某個元素,當然,也可以以下標方式對某元素重新賦值,這點類似於陣列的訪問方式;

採用上一節的例子,用下標的方法訪問容器內的元素:

#include<iostream>

#include<vector>

using namespace std;

int main(int argc,char *argv[])

{

    vector<int>v(3);

    v[0] = 2;

    v[1] = 7;

    v[2] = 9;

    cout << v[0] << " "<< v[1] << " " << v[2] << endl;

    return 0;

}

***迭代器方式訪問vector元素***

常使用迭代器配合for迴圈語句來對vector物件進行遍歷訪問,迭代器的額型別一定要與他要遍歷的vector物件的元素型別一致;

#include<iostream>

#include<vector>

using namespace std;

int main(int argc,char *argv[])

{

    vector<int>v(3);

    v[0] = 2;

    v[1] = 7;

    v[2] = 9;

    //定義迭代器變數

    vector <int> :: iterator it;

    for(it=v.begin(); it != v.end(); it++) {

        //輸出迭代器上的元素值;

        cout << *it << "";

    }

    cout << endl;  //換行;

    return 0;

}

***vector元素插入***

      insert()插入方法可以在vector物件的任意位置前插入一個新的元素,同時,vector自動擴張一個元素的空間,插入位置後的所有元素一次向後挪動一個位置;

      要注意的是,insert()方法要求插入的位置,是元素的迭代器位置,而不是元素的下標

執行結果:8 2 1 7 9 5 3

#include<iostream>

#include<vector>

using namespacestd;

int main(int argc,char *argv[])

{

    vector <int> v(3);

    vector <int> :: iterator it;  //定義迭代器變數;

    v[0] = 2;

    v[1]= 7;

    v[2] = 9;

    v.insert(v.begin(), 8);  //在最前面插入一個新元素,元素值為8;

    v.insert(v.begin()+2, 1);  //在第二個元素前插入新元素1;

    v.insert(v.end(), 3);  //在向量末尾追加新元素3;

    v.insert(v.end()-1, 5);   //在向量倒數第二個元素後面插入一個新元素5;

    for(it=v.begin(); it != v.end(); it++) {

        //輸出迭代器上的元素值;

        cout << *it << "";

    }

    cout << endl;  //換行;

    return 0;

}

***vector元素刪除***

erase()方法可以刪除vector中迭代器所致的一個元素或一段區間中的所有元素。

clear()則一次性刪除vector中的所有元素;

#include<iostream>

#include<vector>

using namespace std;

int main(int argc,char *argv[])

{

    vector <int> v(10);

    vector <int> :: iterator it;

    for(int i=0; i<10; i++) {

        v[i] = i;

    }

    v.erase(v.begin()+2);   //刪除第二個元素,從0開始計數;

    for(it=v.begin(); it != v.end(); it++) {

        cout << *it << "";

    }

    cout << endl;

    v.erase(v.begin()+1, v.begin()+5);   //刪除區間[1, 5)的元素;

    for(it=v.begin(); it != v.end(); it++) {

        cout << *it<< " ";

    }

    cout << endl;

    v.clear(); //刪除全部元素;(清空向量)

    cout << v.size() << endl;  //輸出姓樑大小;

    return 0; 

}

***vector元素反向排列***

reverse反向排列演算法,需要定義標頭檔案#include<algorithm>;

reverse演算法可將向量中某段迭代器區間元素反向排列;

#include<iostream>

#include<vector>

#include<algorithm>

using namespacestd;

int main(int argc,char *argv[])

{

    vector <int> v(10);

    vector <int> :: iterator it;

    for(int i=0;i<10; i++) {

        v[i] = i;

    }

    for(it=v.begin(); it != v.end(); it++) {

        cout << *it << "";

    }

    cout << endl;

    reverse(v.begin(), v.end());  //反向排列向量的從頭到尾間的元素;

    for(it=v.begin(); it != v.end(); it++) {

        cout << *it << "";

    }

    cout << endl;

    return 0;

}

***使用sort演算法對vector內元素排序***

使用sort演算法必須新增標頭檔案#include <algorithm>;

sort演算法要求使用隨機訪問迭代器進行排序,在預設的情況下,對向量元素進行升序排列;

跟對陣列排序的過程相似;

#include<iostream>

#include <vector>

#include<algorithm>

using namespace std;

int main(int argc,char *argv[])

{

    vector <int> v;

    vector <int> :: iterator it;

    for(int i=0; i<10; i++) {

        v.push_back(9-i);

    }

    for(int i=0; i<10; i++) {  //輸出排序前的元素值;

        cout << v[i] << "";

    }

    cout << endl;

    sort(v.begin(), v.end());  //升序排列;

    for(it=v.begin(); it != v.end(); it++){  //輸出排序後的元素值;

        cout << *it << "";

    }

    cout << endl;

    return 0;

}

還可以自己定義cmp排序比較函式,然後,把這個函式指定給sort演算法,那麼,sort就根據這個比較函式指定的排序規則進行排序。下例是從大到小排序;

#include<iostream>

#include<vector>

#include<algorithm>

using namespacestd;

bool cmp(constint a, const int b)

{

    return a > b;

}

int main(int argc,char *argv[])

{

    vector <int> v;

    vector <int> :: iterator it;

    for(int i=0; i<10; i++) {

        v.push_back(i);

    }

    for(int i=0; i<10; i++) {  //輸出排序前的元素值;

        cout << v[i] << "";

    }

    cout << endl;

    sort(v.begin(), v.end(), cmp);  //升序排列;

    for(it=v.begin(); it != v.end(); it++){  //輸出排序後的元素值;

       cout << *it << " ";

    }

    cout << endl;

    return 0;

}

 升序排列也可以用以下兩種方式來實現:
sort(a.rbegin(), a.rend()); //從大到小排序
sort(a.begin(), a.end(), greater<int>()); //從大到小排序


執行:
Sample Input : 
5
5 2 1 4 3
Sample Output:
5 4 3 2 1

看以下程式:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <vector>
using namespace std;


int main()
{
    vector <int> v;
    int n;

    while(~scanf("%d", &n)) {
        int Mc;
        for(int i=0; i<n; i++) {
            scanf("%d", &Mc);
            v.push_back(Mc);
        }
        sort(v.begin(), v.end(), greater<int>());
        //sor(v.rbegin(), v.end());
        vector <int> ::iterator it;
        for(it=v.begin(); it!=v.end(); it++) {
            cout << *it << " ";
        }
        cout << endl;
    }
    return 0;
}

排完序之後去重:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
#include <vector>
using namespace std;

int main()
{
    vector <int> v;
    int n;


    while(~scanf("%d", &n)) {
        int Mc;
        v.clear();
        for(int i=0; i<n; i++) {
            scanf("%d", &Mc);
            v.push_back(Mc);
        }
        sort(v.begin(), v.end(), greater<int>());
        //sor(v.rbegin(), v.end());
        int size = unique(v.begin(), v.end()) - v.begin();
        vector <int> ::iterator it;
        cout << "---size---" << size << endl;
        for(int i=0; i<size; i++) {
            cout << v[i] << " ";
        }
        cout << endl;
    }
    return 0;
}

執行:
Sample Input :
7
2 1 3 2 4 5 4
Sample Output:
---size---5
5 4 3 2 1

***向量的大小是否為空***

使用size()方法可以返回向量的大小,即元素的個數;

使用empty()方法可以返回向量是否為空;

以下是這兩種方法的簡單應用:

#include<iostream>

#include<vector>

using namespace std;

int main(int argc,char *argv[])

{

    vector <int> v;

    vector <int> :: iterator it;

    for(int i=0; i<10; i++) {   //給向量賦值;

        v.push_back(i);

    }

    cout << v.size() << endl;   //輸出向量的大小;(即元素的個數)

    cout << v.empty() << endl;  //判斷是否為空,如果非空,則返回0,如果空,則返回1;

    v.clear();

    cout << v.empty() <<endl;

    return 0;

}

*** vector向量容器的應用 ZOJ 1208***

字串有些事對稱的,有些不是對稱的,請將那些對稱的字串安從小到大的順序輸出,字串先以長度論大小,如果長度相等,再以ASCII碼值為排序標準;

輸入描述: 輸入一個n,表示接下來有n組字串,串長<=256; n<=1000;

輸出描述: 根據每個字串,輸出對稱的那些串,並且要求按從小到大的順序輸出;

輸入樣例:

7

123321

123454321

123

321

sdfsdfd

121212

輸出樣例:

123321

123454321

#include<iostream>

#include<vector>

#include<string>

#include<algorithm>

using namespace std;

bool cmp(const strings1, const string s2)

{

    return (s1.length() != s2.length() ?s1.length() < s2.length() : s1 < s2);

}

int main()

{

    vector <string> v;

    vector <string>:: iterator it;

    int n;

    string s, t;

    while(cin >> n) {

        for(int i=0; i<n; i++) {

            cin >> s;

            t = s;

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

            if(t == s) {

                v.push_back(s);

            }

        }

        sort(v.begin(), v.end(), cmp);

        for(it=v.begin(); it != v.end(); it++){

            cout << *it<< endl;

        }

    }

    return 0;

}