目錄
一,vector 的介紹
二,vector 的定義
1,vector()
2,vector(size_type n, const value_type& val = value_type())
3,vector (const vector& x)
4,vector (InputIterator first, InputIterator last);
三,vector iterator 的使用
1,begin + end
2,rbegin + rend?
四,vector 空間增長問題
1,size
2,capacity
3,empty
4,reserve
5,resize
五,vector 增刪查改
1,push_back
2,pop_back?
3,find
4,insert
5,erase
6,swap
7,operator[]
一,vector 的介紹
1,vector 是表示可變大小數(shù)組的序列容器。
2,就像數(shù)組一樣,vector 也采用的連續(xù)存儲(chǔ)空間來存儲(chǔ)元素。也就是意味著可以采用下標(biāo)對(duì)vector 的元素 進(jìn)行訪問,和數(shù)組一樣高效。但是又不像數(shù)組,它的大小是可以動(dòng)態(tài)改變的,而且它的大小會(huì)被容器自動(dòng)處理。
3,本質(zhì)講,vector 使用動(dòng)態(tài)分配數(shù)組來存儲(chǔ)它的元素。當(dāng)新元素插入時(shí)候,這個(gè)數(shù)組需要被重新分配大小為了增加存儲(chǔ)空間。其做法是,分配一個(gè)新的數(shù)組,然后將全部元素移到這個(gè)數(shù)組。就時(shí)間而言,這是一個(gè)相對(duì)代價(jià)高的任務(wù),因?yàn)槊慨?dāng)一個(gè)新的元素加入到容器的時(shí)候,vector 并不會(huì)每次都重新分配大小。
4,vector 分配空間策略:vector 會(huì)分配一些額外的空間以適應(yīng)可能的增長,因?yàn)榇鎯?chǔ)空間比實(shí)際需要的存儲(chǔ)空間更大。不同的庫采用不同的策略權(quán)衡空間的使用和重新分配。但是無論如何,重新分配都應(yīng)該是對(duì)數(shù)增長的間隔大小,以至于在末尾插入一個(gè)元素的時(shí)候是在常數(shù)時(shí)間的復(fù)雜度完成的。
5,因此,vector 占用了更多的存儲(chǔ)空間,為了獲得管理存儲(chǔ)空間的能力,并且以一種有效的方式動(dòng)態(tài)增長。
6,與其它動(dòng)態(tài)序列容器相比(deque, list and forward_list), vector 在訪問元素的時(shí)候更加高效,在末尾添加和刪除元素相對(duì)高效。對(duì)于其它不在末尾的刪除和插入操作,效率更低。比起list和forward_list 統(tǒng)一的迭代器和引用更好。
二,vector 的定義
1,vector()
無參構(gòu)造
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v1;
return 0;
}
這里我們定義一個(gè) vector 類,它里面的各種數(shù)據(jù)都是初始化了的,不是空就是0;
2,vector(size_type n, const value_type& val = value_type())
構(gòu)造并初始化 n 個(gè) val
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v1(5, 6);
for (int i = 0; i < 5; i++)
{
cout << v1[i]<<" ";
}
return 0;
}
直接自己定義初始化成 n 個(gè) val;
3,vector (const vector& x)
拷貝構(gòu)造
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v1(5, 6);
vector<int> v2(v1);
for (int i = 0; i < 5; i++)
{
cout << v2[i]<<" ";
}
return 0;
}
拷貝構(gòu)造嘛,都老朋友了;
4,vector (InputIterator first, InputIterator last);
使用迭代器進(jìn)行初始化構(gòu)造
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v1(5,6);
for (int i = 0; i < 5; i++)
{
v1[i] = i;
}
vector<int> v2(v1.begin()+1, v1.end()-1);
for (int i = 0; i < 3; i++)
{
cout << v2[i] << " ";
}
return 0;
}
迭代器進(jìn)行初始化構(gòu)造,就是選取一段范圍進(jìn)行拷貝;
三,vector iterator 的使用
1,begin + end
獲取第一個(gè)數(shù)據(jù)位置的 iterator/const_iterator, 獲取最后一個(gè)數(shù)據(jù)的下一個(gè)位置的iterator/const_iterator
2,rbegin + rend?
獲取最后一個(gè)數(shù)據(jù)位置的 reverse_iterator,獲取第一個(gè)數(shù)據(jù)前一個(gè)位置的 reverse_iterator
諸位愛卿,我相信這張圖對(duì)汝等足矣!
四,vector 空間增長問題
1,size
獲取數(shù)據(jù)個(gè)數(shù)
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v1(5, 6);
cout << v1.size();
return 0;
}
獲取有效數(shù)據(jù)個(gè)數(shù),不等同于容量,只是數(shù)據(jù)個(gè)數(shù);
2,capacity
獲取容量大小
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v1(5, 6);
cout << v1.capacity();
return 0;
}
查看空間容量的,不等同于數(shù)據(jù)個(gè)數(shù);
3,empty
判斷是否為空,為空返回真,不為空返回 0;
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v1(5, 6);
vector<int> v2;
cout << v1.empty()<<" "<<v2.empty();
return 0;
}
4,reserve
改變 vector 的 capacity
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v1(5, 6);
cout << v1.capacity() << endl;
v1.reserve(50);
cout << v1.capacity() << endl;
v1.reserve(20);
cout << v1.capacity() << endl;
v1.reserve(3);
cout << v1.capacity() << endl;
return 0;
}
兄弟們自己找找規(guī)律;?
5,resize
改變 vector 的 size
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v1(5, 6);
cout << v1.size() << " " << v1.capacity() << endl;
v1.resize(20);
cout << v1.size() << " " << v1.capacity() << endl;
v1.resize(10);
cout << v1.size() << " " << v1.capacity() << endl;
return 0;
}
size()的值與 capacity 的值息息相關(guān)的,當(dāng) size()大于 capacity 時(shí),capacity 會(huì)增大擴(kuò)容;
五,vector 增刪查改
1,push_back
尾插
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v1(5, 6);
v1.push_back(7);
v1.push_back(8);
for (int i = 0; i < v1.size(); i++)
{
cout << v1[i]<<" ";
}
return 0;
}
2,pop_back?
尾刪
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v1(5, 6);
v1.pop_back();
v1.pop_back();
for (int i = 0; i < v1.size(); i++)
{
cout << v1[i]<<" ";
}
return 0;
}
3,find
查找。(注意這個(gè)是算法模塊實(shí)現(xiàn),不是 vector 的成員接口)
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v1{ 1,2,3,4,5 };
auto pos = find(v1.begin(),v1.end(), 3);
cout << *pos << endl;
pos = find(v1.begin(), v1.end(), 5);
cout << *pos;
return 0;
}
在一個(gè)特點(diǎn)的范圍里尋找一個(gè)數(shù),然后返回指向這個(gè)數(shù)的迭代器;
4,insert
在 position 之前插入 val
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v1{ 1,2,3,4,5 };
auto pos = find(v1.begin(),v1.end(), 3);
cout << *pos << endl;
v1.insert(pos, 66);
for (int i = 0; i < v1.size(); i++)
{
cout << v1[i] << " ";
}
return 0;
}
在指定位置前插入特定的數(shù);
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v1{ 1,2,3,4,5 };
auto pos = find(v1.begin(),v1.end(), 3);
cout << *pos << endl;
v1.insert(pos, 3, 77);
for (int i = 0; i < v1.size(); i++)
{
cout << v1[i] << " ";
}
cout << endl;
return 0;
}
在指定位置前插入指定數(shù)量的數(shù);
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v1{ 1,2,3,4,5 };
auto pos = find(v1.begin(),v1.end(), 3);
cout << *pos << endl;
v1.insert(pos, v1.begin(), v1.begin() + 2);
for (int i = 0; i < v1.size(); i++)
{
cout << v1[i] << " ";
}
return 0;
}
在指定位置前插入一段區(qū)間;
5,erase
刪除 position 位置的數(shù)據(jù)
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v1{ 1,2,3,4,5 };
auto pos = find(v1.begin(), v1.end(), 3);
cout << *pos << endl;
v1.erase(pos);
for (int i = 0; i < v1.size(); i++)
{
cout << v1[i] << " ";
}
return 0;
}
刪除某個(gè)指定位置的數(shù)據(jù);
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v1{ 1,2,3,4,5 };
v1.erase(v1.begin(),v1.end()-1);
for (int i = 0; i < v1.size(); i++)
{
cout << v1[i] << " ";
}
return 0;
}
刪除指定一段區(qū)間的數(shù)據(jù);
6,swap
交換兩個(gè) vector 的數(shù)據(jù)空間
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v1{ 0,1,2,3,4 };
vector<int> v2{ 5,6,7,8,9 };
v1.swap(v2);
for (int i = 0; i < v1.size(); i++)
{
cout << v1[i] << " ";
}
cout << endl;
for (int i = 0; i < v1.size(); i++)
{
cout << v2[i] << " ";
}
return 0;
}
直接交換兩邊的數(shù)據(jù);
7,operator[]
像數(shù)組一樣訪問
這個(gè)我們已經(jīng)很熟悉了;
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v1{ 0,1,2,3,4 };
for (int i = 0; i < v1.size(); i++)
{
cout << v1[i] << " ";
}
return 0;
}
文章來源:http://www.zghlxwxcb.cn/news/detail-768307.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-768307.html
到了這里,關(guān)于【C++】vector 基本使用(詳解)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!