面向對象的數據結構--vector 向量

一.概述
一維數組是數組的最基本的形態。
vector是一維數組的向量形式,vector內部採用與數組一樣的連續存儲方式。
向量可在使用過程中自由的改變長度,從這個角度看,向量是一種動態數組。
向量所使用的內存來自於空閒存儲區(free store)
vector 保留數組的下標運算符,和迭代器

二.使用
1 基本操作
(1)頭文件#include<vector>.
(2)創建vector對象,vector<int> vec;
(3)尾部插入數字:vec.push_back(a);
(4)使用下標訪問元素,cout<<vec[0]<<endl;記住下標是從0開始的。
(5)使用迭代器訪問元素.

vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
    cout<<*it<<endl;

(6)插入元素: vec.insert(vec.begin()+i,a);在第i+1個元素前面插入a;
(7)刪除元素: vec.erase(vec.begin()+2);刪除第3個元素
vec.erase(vec.begin()+i,vec.end()+j);刪除區間[i,j-1];區間從0開始
(8)向量大小:vec.size();
(9)清空

vec.clear();

熟悉向量

#include<iostream>
#include<vector>

using namespace std;

int main()
{
    const size_t d=8//學號8位
    int x= 1;
    vector<int> V;//定義向量
    for(size_t i=0;i<d;i++)
    {
        int num;
        cin>>num;//依次輸入你的學號
        V.push_back(num); 
     } 
     for(size_t i=0;i<d;i++)
     {
        V.push_back(V[i]+x);
        V.push_back(V[i]-X);
     }
     for(size_t i=0;i<V.size();i++)
        cout<<V[i]<<endl;
        cout<<"the length of V is"<<V.size()<<endl;
         return 0; 
}

size_t 是一個數據類型,根據不同系統由系統自行定義,具體可參看編譯器手冊,在32位系統上一般相當於unsign long int。

深入理解

#include<iostream>
#include<vector>

using namespace std;

int main()
{
    const size_t d=8;//無符號的數據類型,學號共8位
    int x=12;
    vector<int> V;
    for(size_t i=0;i<d;i++)
    {
        V.push_back(d);
     } 
     for(size_t i=0;i<d;i++)
     {
        V.pop_back();
     }
     for(size_t i=0;i<d;i++)
     {
        int num;
        cin>>num;
        V.push_back(num*x);
     }
     V.push_back(x);
     for(auto iter=V.begin();iter!=V.end();++iter)//++iter 可以提高效率//auto關鍵字 自動推測數據類型 
        cout<<*iter<<"";
         return 0; 
 } 

auto關鍵詞
C++11 標準推出了一個新的關鍵詞auto,這個關鍵詞可以通過表達式自動推斷返回值的類型,這也是新標準中被各編譯器廠商支持最爲廣泛的特性之一。利用這個關鍵詞可以有效減少代碼的長度,特別是在使用模板元編程的時候。

vector<map<int, string>> stringMapArray;

// 不使用auto版本
vector<map<int, string>>::iterator iter1 = stringMapArray.begin();//名字空間使用

// 使用auto版本
auto iter2 = stringMapArray.begin();

看到這樣簡短的式子,我再也不能忍受第一個包含大量冗餘信息的式子了。所以,最近寫的C++裏到處都是auto,恨不得在lambda的參數列表裏也用(可惜不行)。

1.vector的聲明
vector c; 創建一個空的vector
vector c1(c2); 創建一個vector c1,並用c2去初始化c1 vector c(n) ; 創建一個含有n個ElemType類型數據的vector;
vector c(n,elem); 創建一個含有n個ElemType類型數據的vector,並全部初始化爲elem;
c.~vector(); 銷燬所有數據,釋放資源;

2.vector容器中常用的函數。(c爲一個容器對象)
c.push_back(elem); 在容器最後位置添加一個元素elem
c.pop_back(); 刪除容器最後位置處的元素
c.at(index); 返回指定index位置處的元素
c.begin(); 返回指向容器最開始位置數據的指針
c.end(); 返回指向容器最後一個數據單元的指針+1
c.front(); 返回容器最開始單元數據的引用
c.back(); 返回容器最後一個數據的引用
c.max_size(); 返回容器的最大容量
c.size(); 返回當前容器中實際存放元素的個數
c.capacity(); 同c.size()
c.resize(); 重新設置vector的容量
c.reserve(); 同c.resize()
c.erase(p); 刪除指針p指向位置的數據,返回下指向下一個數據位置的指針(迭代器)
c.erase(begin,end) 刪除begin,end區間的數據,返回指向下一個數據位置的指針(迭代器)
c.clear(); 清除所有數據
c.rbegin(); 將vector反轉後的開始指針返回(其實就是原來的end-1)
c.rend(); 將vector反轉後的結束指針返回(其實就是原來的begin-1)
c.empty(); 判斷容器是否爲空,若爲空返回true,否則返回false
c1.swap(c2); 交換兩個容器中的數據
c.insert(p,elem); 在指針p指向的位置插入數據elem,返回指向elem位置的指針
c.insert(p,n,elem); 在位置p插入n個elem數據,無返回值
c.insert(p,begin,end) 在位置p插入在區間[begin,end)的數據,無返回值

3.vector中的操作
operator[] 如: c.[i];
同at()函數的作用相同,即取容器中的數據。

迭代器
定義:SET中容器多提供了迭代器,SET抽象數據類型提供指針以訪問其元素地址,位置。
類似於導遊 通常將遍歷多個數據接口,訪問受限制的容器一般不可使用迭代器。棧,隊列,優先級隊列
vector簡要使用說明

#include "book.h"

void vector_example()
{
    vector<int> V(10);//初始長度爲10.可用位置10;
    for(size_t i=0;i<V.size();i++)
    V[i]=i;//向量的下標用法與數組相同;
    //使用迭代器賦值
    forauto iter=V.begin();iter!=V.end();++iter)
        *iter=1;
    //使用++iter有利於提高算法的速率
    //begin()位置有元素,end()位置爲空
    //*iter間接尋址
    //在末尾加1000個2
    V.resize(V。size()+10002//擴展vector
    //再向量末尾加入3
    V.push_back(3);
    //若V不爲空,則在屏幕上輸出w並刪除
    while(!V.empty())
    {
        cout<<V.back()<<endl;
        V.pop_back();
    }
}

自然數列

int data;
cin>>data;
while(data>=0)
{
    v.push_back(data);
    cin>>data;
}

在屏幕上輸出每個元素後添加空格
1.使用下標

for(size_t i=0;i<v.size();i++)
cout<<v[i]<<'';

2.使用迭代器
常量迭代器只讀不寫;
cend,cbegin.不同於begin,end

forauto c_iter=V.cbegin();c_iter!=v.cend();++c_iter)
couut<<*c_iter<<'';

3.使用copy算法

#include<algorithm>
#include<iterator>
copy(V.cbegin();,v.cend(),ostream_iterator<int>(cout,""));
發佈了26 篇原創文章 · 獲贊 4 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章