c++重拾 STL vector使用

vector

標準庫vector表示對象的集合,其中所有的對象類型都相同。有了vector就儘量不要用數組了。我在oj上做編程題時,用數組時就可能出現一些無法理解的錯誤,而僅僅把定義改成vector就完全沒問題。

定義,初始化

vector<int> v1;
vector<vector<string>> file;
vector<Node> t; 還可以爲自定義類型變量。
常見:

vector<int> v;
for(int i=0;i!=100;++i){
	v.push_back(i);
}

string word;
vector<string> text;
while(cin>>word){
	text.push_back(word);
}

c++標準要求vector應該能在運行時高效地添加元素。

操作

熟悉增刪查改。

  • v.empty() 判空

  • v.size() 查容器大小(元素個數)

  • v[i] 可用下標訪問元素

  • v1= v2 拷貝

  • v1== v2 v1!=v2 比較

  • v.begin() 返回指向容器第一個元素的迭代器

  • v.end() 返回指向容器最後一個元素的迭代器

  • 增:插入元素
    v.push_back(elem) 添加元素(在尾部追加一個元素)

    v.insert(iter_pos, elem) 在iteration position處插入一個元素elem
    v.insert(iter_pos, m, elem) 在iterationposition處插入m個元素elem
    eg:
    v.insert(v.begin(), 666); 在最前面插入一個元素666
    v.insert(v.begin()+i, 888); 在v[i]處插入一個元素(自然v[i]就讓位),或者說在現在的v[i]前插入一個元素888;或者說,在第i個元素後面添加

  • 刪:
    v.pop_back() 刪除最後一個元素 void pop_back ( );注意只刪除,並不返回元素
    v.erase(iter_pos) 刪除iter_pos處的元素
    v.erase(beg, end) 刪除區間**[beg, end)的元素,注意是右開區間,不包括end**
    v.erase(v.begin()) 刪除開頭那個元素 ,或者說刪除v[0]
    v.erase(v.begin()+i) 刪除v[i]
    v.erase(v.begin()+i, v.begin()+j) 刪除v[i]到v[j]的元素,不包括v[j]

    v.clear() 移除容器中所有的元素。

例子

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> v;
    int elem;
    cout<<"intput elements: ";
    while(cin>>elem){
        v.push_back(elem); //添加元素(末尾追加)
    }
    //原{2,4,6,8}

    //判斷容器空不空:
    cout<<v.empty()<<endl;

    cout<<"---------------"<<endl;
    //insert插入元素:
    cout<<"changing..... ";
    //v.insert(v.begin(), 666);//在最前面插入666  ||結果:666 2 4 6 8
    //v.insert(v.begin()+1, 666);//在第一個元素之後插入666/ 或者說,在v[1]前面插入元素666  ||結果:2 666 4 6 8
    v.insert(v.begin()+1, 2, 666);// 在第一個元素之後插入 2個 666  ||結果:2 666 666 4 6 8

    //erase刪除元素:
    v.erase(v.begin());//刪除v[0]/ 或者說刪除最前面的元素   ||結果:666 666 4 6 8
    v.erase(v.begin(), v.begin()+2);//刪除[v[0],v[2])區間的元素,注意是包括v[0],但不包括v[2]  ||結果:4 6 8

    cout<<"changed: ";
    cout<<"the first elem:"<< v.front()<<" 等價於v[0]:"<<v[0]<<endl;

    for(auto x: v){
        cout<<x<<" ";
    }

    cout<<"大小: "<<v.size()<<endl;

    //移除容器中所有元素:
    v.clear();
    cout<<"clear()後的容器大小: "<<v.size()<<endl;

    cout<<"添加5個888後: ";
    v.insert(v.begin(),5,888);
    //可以採用下標遍歷,推薦採用範圍for
    for(int i=0;i<int(v.size());++i){
        cout<<v[i]<<" ";
    }

    cout<<"重設大小:大於原容器大小的,補0;小於原容器大小的,後面的就不要了"<<endl;
    v.resize(10);
    for(auto x: v){
        cout<<x<<" ";   //輸出:888 888 888 888 888 0 0 0 0 0
    }


    return 0;
}

關於容器容量的變化,有興趣的,可以看一下下面這個代碼:
v.capacity()容器容量
v.size()容器裏元素個數

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> v;

    cout<<"容器容量:"<<v.capacity()<<endl;  //0

    int elem;
    cout<<"intput elements: ";
    while(cin>>elem){
        v.push_back(elem); //添加元素(末尾追加)
    }
    //原{2,4,6,8}
    cout<<"容器容量:"<<v.capacity()<<endl;  //4


    //判斷容器空不空:
    cout<<v.empty()<<endl;

    cout<<"---------------"<<endl;
    //insert插入元素:
    cout<<"changing..... ";
    //v.insert(v.begin(), 666);//在最前面插入666  ||結果:666 2 4 6 8
    //v.insert(v.begin()+1, 666);//在第一個元素之後插入666/ 或者說,在v[1]前面插入元素666  ||結果:2 666 4 6 8
    v.insert(v.begin()+1, 2, 666);// 在第一個元素之後插入 2個 666  ||結果:2 666 666 4 6 8
    
    cout<<"容器容量:"<<v.capacity()<<endl;  //8 這個時候元素6個,容器容量增長爲8了

    //erase刪除元素:
    v.erase(v.begin());//刪除v[0]/ 或者說刪除最前面的元素   ||結果:666 666 4 6 8
    v.erase(v.begin(), v.begin()+2);//刪除[v[0],v[2])區間的元素,注意是包括v[0],但不包括v[2]  ||結果:4 6 8

    cout<<"changed: ";
    cout<<"the first elem:"<< v.front()<<" 等價於v[0]:"<<v[0]<<endl;

    for(auto x: v){
        cout<<x<<" ";
    }

    cout<<"大小: "<<v.size()<<endl;


    //移除容器中所有元素:
    v.clear();
    cout<<"clear()後的容器大小: "<<v.size()<<endl;//0
    cout<<"容器容量:"<<v.capacity()<<endl;//仍然爲8


    cout<<"添加5個888後: ";
    v.insert(v.begin(),5,888);
    //可以採用下標遍歷,推薦採用範圍for
    for(int i=0;i<int(v.size());++i){
        cout<<v[i]<<" ";
    }

    cout<<"容器容量:"<<v.capacity()<<endl; //8

    cout<<"重設大小:大於原容器大小的,補0;小於原容器大小的,後面的就不要了"<<endl;
    v.resize(10);
    for(auto x: v){
        cout<<x<<" ";   //輸出:888 888 888 888 888 0 0 0 0 0
    }

    cout<<"容器容量:"<<v.capacity()<<endl; //10 容量在增長

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