1. 程式人生 > >STL—vector(向量容器)

STL—vector(向量容器)

什麼是vector:

vector是一種可以完全代替陣列的高效容器。完全代替陣列的意思就是,陣列能幹的vector都能幹,如隨機訪問元素,用下標遍歷元素等。陣列不能幹的它也能幹,如記憶體自動管理功能,即它可以根據元素的插刪動態調整所佔的記憶體空間。

標頭檔案

#include<vector>

基本操作

 push_back();               //從尾部插入元素
 insert();                  //插入新元素,可在任意位置
 erase();                   //刪除迭代器所指的一個元素或一個區域
 clear();                  //刪除所有元素
 size();                    //返回向量的大小
 empty();                   //判斷是否為空
 reverse();                 //反向排序演算法,此演算法需要宣告標頭檔案 #include<algorithm>
 sorp();                    //預設用升序排序,但是也可以自定義排序規則,加標頭檔案#include<algorithm>

建立vector物件

vector<int> p;             //建立物件p,不指定元素個數
vector<double> p(10);      //建立物件p ,指定有10個元素,預設為0.0
vector<double> p(10,12.3); //建立物件p,指定有10個元素,且每個元素的值都為12.3

元素插入

1.從尾部擴張插入
p.push_back(a);            //將 a 的值插入到物件 p 的尾部
2.利用迭代器插入
p.insert(p.begin(),5);     //在最前面插入新元素5
p.insert(p.begin()+2,5)    //在下標為2的元素前面插入新元素5

元素刪除

p.erase(p.begin()+2);      //刪除下標為2的元素
p.erase(p.begin()+1,p.begin()+5); //刪除下標為[1.5)的元素,區間左閉右開
p.clear();                 //刪除所有元素

利用reverse反向排序

everse(p.begin(),p.end()); //這種方法還可以只排序規定的區間,如
reverse(p.begin()+2,p.begin()+8)//將下標為[2,8)的元素進行反排序

利用sort演算法排序

sorp(p.begin(),p.end());   //預設升序排列,也可以只排列一個區間
sorp(p.begin(),p.end(),comp) //利用自定義排序規則comp進行排序
sort排序規則定義方法

非結構體

  bool comp(const &a,const &b)
  {
        return a>b;//降序
  }
 另:
  bool comp(int a,int b)
  {
        return a>b;
  }

結構體

struct lei
{
    int k;
    int w;
}a,b;
bool com(lei a,lei b)
{
    return a.k>b.k;//降序
}

程式碼示例

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
    int i;
    vector<double> p;
//  vector<int> p(10);                            //建立一個物件,內部儲存著是個元素,每個元素都為0
//  vector<int> p(10,8);                          //建立vector物件,規定有10個元素,都為8,同樣可用 p.push_back()從尾部擴張元素
    for(i=0;i<10;i++)
    {
        p.push_back(i+1);                         //尾插法擴張元素
    }
    cout<<p.size()<<endl;
//  p.insert(p.begin()+2,6);                      //insert()隨意插入,插在下標為2的前面
    for(i=0;i<10;i++)                             //下標法遍歷
    {
        cout<<p[i]<<" ";
    }
//  reverse(p.begin(),p.end());                    //反向排序
    cout<<endl;
    p.erase(p.begin()+2);                          //刪除單個元素    第三個   可理解為下標,p.begin()為首元素地址,首元素其下標為0,故p.begin()+2則為下標為2的元素
    p.erase(p.begin(),p.begin()+3);                //刪除區間元素    第一個到第三個     /*凡涉及到區間的都是左閉右開*/
//  p.clear()                                      //刪除所有元素    p.erase(p.begin(),p.end());效果一樣
    vector<double>::iterator it,il;                //定義迭代器變數
    for(it=p.begin();it!=p.end();it++)             //迭代器法遍歷
    {
        cout<<*it<<" ";
    }
    cout<<endl;
    return 0;
}