一.概述
一維數組是數組的最基本的形態。
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;//向量的下標用法與數組相同;
//使用迭代器賦值
for(auto iter=V.begin();iter!=V.end();++iter)
*iter=1;
//使用++iter有利於提高算法的速率
//begin()位置有元素,end()位置爲空
//*iter間接尋址
//在末尾加1000個2
V.resize(V。size()+1000,2)//擴展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
for(auto 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,""));