【c++】use vector

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main(){
    //vector的定義和初始化
    cout << "\n定義和初始化vector:--------->" << endl;
    vector<int> v1;//定義一個空的vector,執行默認初始化
    vector<int> v2(v1);//定義一個拷貝v1的副本
            //指定數量的初始化
    vector<string> v3(3, "str");//定義一個初始含有3個“str”字符串的vector
    vector<int> v4(10);//定義初始含有10個默認初始化的vector(對於int,默認初始化全爲0,對於string,全爲空字符串)
            //用初始化列表進行初始化,注意是{ }而不是( ),前者用於列表初始化,後者用於提供構造信息,如v3和v4
    vector<int> v5{ 1, 2, 3, 4, 5 };//定義一個被自定義初始化的vector
    vector<int> v6 ={ 1, 2, 3 };//等價於v5

    //使用assign()爲vector賦值(注意不是添加,而是覆蓋)
    v1.assign(v5.begin(), v5.end() - 2);//將v5的開始到倒數第三個元素拷貝給v1
    v1.assign(4, 3);//使用4個3爲v1賦值

    //使用back()獲取vector的最後一個元素
    cout <<"\n使用back()獲取vector的最後一個元素:"<< v1.back() << endl;

    //使用front()獲取vector的第一個元素
    cout <<"\n使用front()獲取vector的第一個元素:"<< v1.front() << endl;

    //使用insert()向vector中插入元素(是插入,不是覆蓋,也不是替換,元素將後移)
    v1.insert(v1.begin(), 5);//在開始位置插入元素5
    v1.insert(v1.begin()+1, 3, 5);//在第一號開始插入3個5
    int arr[5] = { 1, 2, 3, 4, 5 };
    v1.insert(v1.begin(), arr + 1, arr + 3);//將數組b的第1和第2個元素插入到開始位置


    //使用push_back()添加元素到vector末尾,vector能高效管理內存,所以在定義時指定大小(v3,v4)是沒有必要的。
    cout << "\n使用push_back()添加元素到vector末尾--------------->" << endl;
    int a;
            //cin返回爲輸入流,當輸入流爲無效(如需要int輸入string時,vs測試是直接退出程序,無任何提示)
            //或輸入文件結束符EOF(windows下爲ctrl+z,類unix下爲ctrl+d)結束
    //while (cin >> a){
    //  v1.push_back(a);
    //}
    v1 = { 1, 2, 4, 5, 6, 5 };


    //使用empty()判斷vector是否爲空
    cout << "\n判斷vector是否爲空----------------->" << endl;
    if (v1.empty()){
        cout << "v1 is empty!" << endl;
    }
    else{
        cout << "v1 is not empty!" << endl;
    }
    //使用size()返回vector元素個數
    cout << "\nnumber of v1 is:" << v1.size() << endl;
    //使用resize()來重新定義vector大小
    v1.resize(20);//原來元素多則刪,少則補隨機值
    v1.resize(20, 2);//原來元素多則刪,少則補2

    //使用下標運算符[ ]訪問指定位置的元素(返回元素的引用,故只要元素不是常量,就可以用下標來對元素進行賦值操作,
    //但下標不能用於添加新元素)
    cout << "\n使用下標[0]訪問指定位置的元素--------------->" << endl;
    cout << v1[0] << endl;


    //使用=拷貝替換,也可以理解爲賦值,整個vector全部替換,包括size等信息
    v2 = v5;
    cout << "\n使用=拷貝替換後的v2------------->" << endl;
    for (int i = 0; i < v2.size(); i++){
        cout << v2[i] << " ";
    }
    //使用列表{  }來拷貝替換
    v2 = { 2, 3, 4 };
    cout << "\n使用列表{  }來拷貝替換後的v2------------->" << endl;
    for (int i = 0; i < v2.size(); i++){
        cout << v2[i] << " ";
    }
    //使用==判斷兩vector相等,當且僅當對應元素都相等時爲真
    //!=同理
    cout << "\n使用==判斷兩vector相等-------------->" << endl;
    if (v1 == v2){
        cout << "v1 = v2!" << endl;
    }
    else{
        cout << "v1 != v2!" << endl;
    }

    //使用關係運算符(>,<,>=,<=)判斷兩個vector大小
    //按字典順序進行比較
    cout << "\n使用關係運算符判斷兩個vector大小---------->" << endl;
    if (v1 > v2){
        cout << "v1 > v2" << endl;
    }

    //使用範圍for來訪問vector中的元素
    cout << "\n使用範圍for來訪問vector中的元素----------->" << endl;
    for (auto &i : v2){ //i爲元素的引用,這樣可以通過i來修改v2的元素
        i *= i;
    }
    for (auto i : v2){ //只讀,不能修改
        cout << i << " ";
    }

    //使用迭代器(與指針類似)
        //使用begin()返回表示第一個元素的迭代器
    cout << "\n使用begin()返回表示第一個元素的迭代器----------->" << endl;
    auto b = v1.begin();
    cout << *b << endl;
        //使用end()返回指向尾元素之後的位置的迭代器(尾後迭代器)
        //當vector爲空時,begin()和end()都返回尾後迭代器
    cout << "\n使用end()返回指向尾元素之後的位置的迭代器----------->" << endl;
    auto e = v1.end();
    cout << *(e-1) << endl;//訪問*e將會出錯
        //迭代器運算
    cout <<"返回迭代器所指的元素的引用:"<< *b << endl;
    //iter->mem,返回iter所指的元素(類,結構體等)mem成員
    //cout << "返回上一個元素:" << *(--e) << endl;
    //cout << "返回下一個元素:" << *(++b) << endl;
    //==和!=分別用於判斷兩個迭代器是否相等
    //一個綜合的例子:
    cout << "\n一個綜合的例子:-------->" << endl;
    for (auto it = v1.begin(); it != v1.end(); it++){
        cout << *it << " ";
    }


    //迭代器類型,前面我們獲取的迭代器類型都是用auto自動推算的,也可以手動添加
    cout << "\n定義讀寫義迭代器:------------>" << endl;
    for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++){
        cout << *it << " ";
        *it += 1;
    }
    //如果vector中的元素是一個常量,則只能使用const_iterator
    //若vector中元素是常量,則begin()和end()返回只讀迭代器,
    //也可以使用cbegin()和cend()來返回非常量元素容器的只讀迭代器
    vector<const int> v7 = { 1, 2, 3, 4, 5 };
    cout << "\n定義只讀(const)義迭代器:------------>" << endl;
    for (vector<const int>::const_iterator it = v7.cbegin(); it != v7.cend(); it++){
        cout << *it << " ";
    }

    //使用解引用符號獲取迭代器所指元素
    cout << "\n使用解引用符號獲取迭代器所指元素:" << *(v1.begin()) << endl;
    //對於元素是類或者結構體的容器,可以使用解引用和.訪問成員,
    //也可以直接使用箭頭運算符->訪問成員(和指針一樣一樣的)

    //
    //可以使用+、-、+=、-=一個整數值來是迭代器跳過一些元素
    //可以將兩個迭代器相減得到兩迭代器之間的差值
    //可以使用>、>、=<、<=來比較兩個迭代器的大小


    //使用pop_back()來刪除vector的尾元素
    v1.pop_back();

    //使用erase()來刪除元素
    v1.erase(v1.begin(), v1.begin() + 5);//刪除開始到begin()+5之前那個元素,不包括後者

    //使用clear()來清空vector
    v1.clear();

    //使用{}來將數組中的元素全部初始化爲0,不初始化則全爲隨機值
    int arr1[12]{};
    for (auto i : arr1){//可以使用範圍for循環訪問數組
        cout << i << " ";
    }

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