- vector與常用的數組類似,佔用連續內存空間,對隨機存取支持很好。可以類似數組用下標訪問,也可以類似字符串用
vector.at()
成員函數訪問
- vector是尾部開口設計,類似棧。從尾部插入數據效率最高(push_back()函數)
- vector可以自動實現動態空間申請和釋放,使用簡便
- vector定義於
vector.h
,命名空間std
一、構造函數
編號 |
構造函數 |
解釋 |
1 |
vector<T>(); |
創建一個沒有任何元素的向量 |
2 |
vector<T>(vector & _Right); |
創建一個向量,並用另一個向量_Rigth初始化它 |
3 |
vector<T>(size_type nSize); |
創建一個大小爲nSize的向量 |
4 |
vector<T>(size_type nSize , const_type _Val); |
創建一個大小爲nSize的向量,全部初始化爲Val |
5 |
vector<T>(InputIterator _First , InputIterator _last) |
創建一個向量,並以迭代器 _First和 _last之間的元素初始化該向量 |
- T可以是
int
、float
等類型,也可以是自定義的類
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int>::iterator v1_Iter, v2_Iter,v3_Iter,v4_Iter,v5_Iter,v6_Iter;
vector<int>v1(3);
cout<<"v1=";
for(v1_Iter=v1.begin();v1_Iter!=v1.end();v1_Iter++)
cout<<" "<<*v1_Iter;
cout<<endl;
vector<int>v2(5,2);
cout<<"v2=";
for(v2_Iter=v2.begin();v2_Iter!=v2.end();v2_Iter++)
cout<<" "<<*v2_Iter;
cout<<endl;
vector<int>v3(v2);
cout<<"v3=";
for(v3_Iter=v3.begin();v3_Iter!=v3.end();v3_Iter++)
cout<<" "<<*v3_Iter;
cout<<endl;
vector<int>v4(v2.begin()+1,v2.begin()+3);
cout<<"v4=";
for(v4_Iter=v4.begin();v4_Iter!=v4.end();v4_Iter++)
cout<<" "<<*v4_Iter;
cout<<endl;
vector<int>v5;
cout<<"v5=";
for(v5_Iter=v5.begin();v5_Iter!=v5.end();v5_Iter++)
cout<<" "<<*v5_Iter;
cout<<endl;
return 0;
}
- 注意vector重載了運算符
=
,可以用=
在兩個對象間複製數據
二、vector元素操作
1、靜態vector
const vector<int> ivec(...);
這樣的定義,是指ivec
容器中所有元素都是const
的
const vector<int> ivec(10,10);
ivec[0] = 1;
vector<const int> ivec(...);
這樣的定義,會被編譯器當做vector<int>
處理
vector<const int> ivec2(10, 10);
ivec2[0] = 1;
2、讀向量容器元素的操作
- 這個表裏所有
pos
都是size_type型
變量,調用時寫數字,從0開始
函數 |
功能 |
調用示例 |
reference front(); |
返回第一個元素的引用 |
v1.front(); |
const_reference front() const; |
返回第一個元素的常引用(const vector) |
v1.front(); |
reference back(); |
返回最後一個元素的引用 |
v1.back(); |
const_reference back() const; |
返回最後一個元素的常引用(const vector) |
v1.back(); |
reference opreator [] (size_type Pos); |
返回Pos指定位置上的元素的引用 |
v1[Pos] |
reference at(size_type Pos); |
返回Pos指定位置上的元素的引用 |
v1.at(Pos); |
const_reference operator [] (size_type_Pos) const; |
返回Pos指定位置上的元素的常引用(const vector) |
v1[Pos] |
const_reference at(size_type Pos) const; |
返回Pos指定位置上的元素的常引用(const vector) |
v1.at(Pos); |
- 這個表裏所有
pos
·都是iterator
迭代器類型,這幾個常用在for循環中遍歷vcetor
函數 |
功能 |
調用示例 |
iterator begin() |
返回向量頭指針,指向第一個元素 |
v1.begin() |
iterator end() |
返回向量尾指針,指向最後一個元素後面 |
v1.end() |
reverse_iterator rebegin() |
反向迭代器,指向最後一個元素 |
v1.rebegin() |
iterator rend() |
反向迭代器,指向第一個元素前面 |
v1.rend() |
3、改變數據的成員函數
- 注意,以下都是vector對象的成員函數
- 這個表裏所有
pos
·都是iterator
迭代器類型
函數 |
功能 |
調用示例 |
void clear() |
刪除容器中所有元素 |
v1.clear() |
iterator erase(pos) |
刪除容器中pos位置元素 |
v1.erase(v.begin()) |
iterator erase(beg , end) |
刪除beg到end-1間所有元素 |
v1.erase(v1.begin()+1 , v1.begin()+5) |
iterator insert(iterator pos , const T &elem) |
在pos位置插入一個元素elem |
v1.insert(v1.begin()+1 , 200); |
void insert(iterator pos , int n, const T &elem) |
在pos位置前插入元素elem的n個拷貝 |
v1.insert(v1.begin()+1 , 3 , 200); |
void insert(iterator pos , const_iterator beg , const_iterator end) |
將另一vector從beg到end-1間所有元素的拷貝插入pos位置前 |
v.insert(v.begin(),v.begin()+4,v.begin()+7); |
void push_back(elem) |
將elem的一個拷貝插入容器末尾 |
v1.push_back(10); |
void pop_back() |
刪除一個末尾元素 |
v1.pop_back(): |
void resize(size_type num) |
將元素個數改爲num。如果size()增加,由默認構造函數創建新元素 |
v1.resize(10); |
void resize(size_type num,elem) |
將元素個數改爲num。如果size()增加,由默認構造函數將其初始化爲elem |
v1.resize(10,0); |
void swap (vector &) |
交換兩個同類型向量的數據 |
v1.swap(v2) |
void assign(int n , const T &x) |
設置容器大小爲n個元素,每個值爲x |
v1.assign(10 0) |
4、描述容器狀態的函數
函數 |
功能 |
調用示例 |
size_type capacity() const; |
返回當前存儲空間下,容器可容納的元素數目(空間由vector自行動態申請,1/2/4/8規律遞增) |
v1.capacity() |
bool empty() const; |
返回容器是否爲空 |
v1.empty() |
size_type size() const; |
返回容器中當前存儲元素的數目 |
v1.size() |
size_type max_zise() const; |
返回可以輸入容器的最大元素數目 |
v1.max_size() |
5、綜合示例
#include<iostream>
#include<vector>
using namespace std;
void print(vector<int> &v)
{
for(int i=0;i<v.size();i++)
cout<<v[i]<<" ";
cout<<endl;
}
int main()
{
vector<int>::iterator v_i;
vector<int>v;
v.push_back(103); cout<<" 當前容量:"<<v.capacity()<<endl;
v.push_back(765); cout<<" 當前容量:"<<v.capacity()<<endl;
v.push_back(208); cout<<" 當前容量:"<<v.capacity()<<endl;
v.push_back(435); cout<<" 當前容量:"<<v.capacity()<<endl;
cout<<endl;
cout<<"利用迭代器打印:";
for(v_i=v.begin();v_i!=v.end();v_i++)
cout<<*v_i<<" ";
cout<<endl;
cout<<"利用at打印:";
for(int i=0;i<v.size();i++)
{
int &nValue=v.at(i);
cout<<nValue<<" ";
}
cout<<endl;
cout<<"利用下標打印:";
for(int i=0;i<v.size();i++)
cout<<v[i]<<" ";
cout<<endl<<endl;
cout<<"在第一位插入100:";
v.insert(v.begin(),100);
print(v);
cout<<" 當前容量:"<<v.capacity()<<endl<<endl;
cout<<"在第二位插入3個200:";
v.insert(v.begin()+1,3,200);
print(v);
cout<<" 當前容量:"<<v.capacity()<<endl<<endl;
cout<<"在第一位插入第五到八位:";
v.insert(v.begin(),v.begin()+4,v.begin()+7);
print(v);
cout<<" 當前容量:"<<v.capacity()<<endl<<endl;
cout<<"刪除第一個元素:";
v.erase(v.begin());
print(v);
cout<<endl<<"pop一個元尾部素:"<<v.back()<<endl;
v.pop_back();
print(v);
cout<<endl<<"清空元素:";
v.clear();
print(v);
cout<<" 當前容量:"<<v.capacity()<<endl<<endl;
cout<<endl<<"assign整體賦值:";
v.assign(10,0);
print(v);
cout<<" 當前容量:"<<v.capacity()<<endl<<endl;
return 0;
}
三、C++11中vector新特性
- dev-C++使用C++11特性,需要
工具 -> 編譯選項 -> 編譯時加入以下命令(打鉤)-> 寫 “-std=c++11”
1、使用列表{}對vector進行初始化賦值
vector<int>v1={1,2,3};
vector v2{1,2,3};
2、利用for遍歷元素並進行簡單操作
- 引用傳遞並進行運算
for(auto &i : v1) i*=i;
- 值傳遞並進行操作
for(auto i : v1) cout<<i<<endl;
3. 示例
#include <iostream>
#include <vector>
using namespace std;
#define print(V) for(auto i:V) {cout<<i<<" ";} cout<<endl;
int main()
{
vector<int>v1={1,2,3,4};
print(v1);
vector<int>v2{4,3,2,1};
print(v2);
for(auto &i : v1) i*=i;
print(v1);
return 0;
}