網(wǎng)站首頁 編程語言 正文
文章目錄
- 一、Vector容器簡介
- 二、基本操作
- 三、代碼實(shí)現(xiàn)
- 1. 構(gòu)造函數(shù)
- 2. 賦值
- 3. 插入和刪除
- 4. 容量和大小
- 5. 數(shù)據(jù)存取
- 6. 預(yù)留空間
- 7. 互換容器
一、Vector容器簡介
vector是 C++ 標(biāo)準(zhǔn)模板庫 中的部分內(nèi)容,中文偶爾譯作“容器”,但并不準(zhǔn)確。 它是一個(gè)多功能的,能夠操作多種數(shù)據(jù)結(jié)構(gòu)和算法的模板類和函數(shù)庫。 vector之所以被認(rèn)為是一個(gè)容器,是因?yàn)樗軌蛳袢萜饕粯哟娣鸥鞣N類型的對象,簡單地說,vector是一個(gè)能夠存放任意類型的 動態(tài)數(shù)組 ,能夠增加和壓縮數(shù)據(jù)。
容器特性
-
順序序列
順序容器中的元素按照嚴(yán)格的線性順序排序。可以通過元素在序列中的位置訪問對應(yīng)的元素。 -
動態(tài)數(shù)組
支持對序列中的任意元素進(jìn)行快速直接訪問,甚至可以通過指針?biāo)闶鲞M(jìn)行該操作。提供了在序列末尾相對快速地添加/刪除元素的操作。 -
能夠感知內(nèi)存分配器的(Allocator-aware)
容器使用一個(gè)內(nèi)存分配器對象來動態(tài)地處理它的存儲需求。
二、基本操作
- 構(gòu)造函數(shù)
// vector<T> v; 采用模板實(shí)現(xiàn)類實(shí)現(xiàn),默認(rèn)構(gòu)造函數(shù)
// vector(v.begin(),v.end()); 將v[begin(),end())區(qū)間中的元素拷貝給本身
// vector(n,elem); 構(gòu)造函數(shù)將n個(gè)elem拷貝給本身
// vector(const vector &vec); 拷貝構(gòu)造函數(shù)
- 賦值
//總結(jié):vector賦值方式比較簡單,使用operator=或者assign都可以
// 給vector容器進(jìn)行賦值
// vector &operator=(const vector &vec); 重載等號操作符
// assign(beg,end); 將[begin(),end())區(qū)間中的數(shù)據(jù)拷貝賦值給本身
// assign(n,elem); 將n個(gè)elem拷貝賦值給本身
- 插入和刪除
// push_back(ele); 尾部插入元素ele
// pop_back(); 刪除最后一個(gè)元素
// insert(const_iterator pos,ele); 迭代器指向位置pos插入元素ele
// insert(const_iterator pos,int count,ele); 迭代器指向位置pos插入count個(gè)元素ele
// erase(const_iterator pos); 刪除迭代器指向的元素
// erase(const_iterator start,coust_iterator end); 刪除迭代器從start到end之間的元素
// clear(); 刪除容器中所有元素
- 容量和大小
// empty(); 判斷容器是否為空
// capacity(); 容器的容量
// size(); 返回容器中元素的個(gè)數(shù)
// resize(int num); 重新指定容器的長度為num,若容器變長,則以默認(rèn)值填充新位置
// 若容器變短,則末尾超出容器長度的元素被刪除
// resize(int num,elem); 重新指定容器的長度為num,若容器變長,則以elem值填充新位置
// 若容器變短,則末尾超出容器長度的元素被刪除
- 數(shù)據(jù)存取
// at(int idx); 返回索引idx所指的數(shù)據(jù)
// operator[]; 返回索引idx所指的數(shù)據(jù)
// front(); 返回容器中第一個(gè)數(shù)據(jù)元素
// back(); 返回容器中最后一個(gè)數(shù)據(jù)元素
- 預(yù)留空間
//總結(jié): 如果數(shù)據(jù)量較大時(shí),可以一開始利用reserve 預(yù)留空間
//減少vector在動態(tài)擴(kuò)展容量時(shí)的擴(kuò)展次數(shù)
// reserve(int len); 容器預(yù)留len個(gè)元素長度,預(yù)留位置不初始化,元素不可訪問
- 互換容器
// swap(vwc); 將vec與本身的元素互換
三、代碼實(shí)現(xiàn)
1. 構(gòu)造函數(shù)
void printVector(vector<int> &p)
{
for(vector<int>::iterator it=p.begin();it!=p.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
//vector 容器構(gòu)造
void test01()
{
vector<int> v1; //默認(rèn)構(gòu)造
for(int i=0;i<10;i++)
{
v1.push_back(i); //后插入數(shù)值
}
printVector(v1);
//通過區(qū)間方式進(jìn)行構(gòu)造
vector<int> v2(v1.begin(),v1.end()); //將v1的值賦給v2
printVector(v2);
//n個(gè)elem方式構(gòu)造
vector<int> v3(10,100); //將10個(gè)為100的數(shù)值 賦給v3
printVector(v3);
//拷貝構(gòu)造
vector<int> v4(v3); //將v3的值拷貝給v4
printVector(v4);
}
2. 賦值
void printVector(vector<int> &p)
{
for(vector<int>::iterator it=p.begin();it!=p.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
//vector 容器賦值
void test01()
{
vector<int> v1; //默認(rèn)構(gòu)造
for(int i=0;i<10;i++)
{
v1.push_back(i); //后插入數(shù)值
}
printVector(v1);
//賦值 operator=
vector<int> v2;
v2=v1;
printVector(v2);
//assign
vector<int> v3;
v3.assign(v1.begin(),v1.end()); //利用assign區(qū)間方式(左閉右開) 將v1賦值給v3
printVector(v3);
//n個(gè)elem方式賦值
vector<int> v4;
v4.assign(10,100); //10個(gè)100賦值給v4
printVector(v4);
}
3. 插入和刪除
void printVector(vector<int> &p)
{
for(vector<int>::iterator it=p.begin();it!=p.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
//vector 容器進(jìn)行插入、刪除操作
void test01()
{
vector<int> v1; //默認(rèn)構(gòu)造
//尾插
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
v1.push_back(50);
//遍歷
printVector(v1);
//尾刪
v1.pop_back();
printVector(v1);
//插入 第一個(gè)參數(shù)是迭代器
v1.insert(v1.begin(),100); //在開頭位置插入100
printVector(v1);
v1.insert(v1.begin(),2,1000); //在開頭位置插入兩個(gè)1000
printVector(v1);
//刪除 參數(shù)是迭代器
v1.erase(v1.begin()); //刪除開頭第一個(gè)元素
printVector(v1);
//清空
// v1.erase(v1.begin(),v1.end()); //刪除從開頭到最后一個(gè)元素
v1.clear();
printVector(v1);
}
4. 容量和大小
void printVector(vector<int> &p)
{
for(vector<int>::iterator it=p.begin();it!=p.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
//vector容器的容量和大小操作
void test01()
{
vector<int> v1; //默認(rèn)構(gòu)造
for(int i=0;i<10;i++)
{
v1.push_back(i); //后插入數(shù)值
}
printVector(v1);
if(v1.empty()) //為真 代表容器為空
{
cout<<"v1為空"<<endl;
}
else
{
cout<<"v1不為空"<<endl;
cout<<"v1的容量為:"<<v1.capacity()<<endl;
cout<<"v1的大小為:"<<v1.size()<<endl;
}
//重新指定大小
v1.resize(15,100); //利用重載版本,可以指定默認(rèn)填充值 這里設(shè)定的大小長度為15,長出的部分用100填充(不設(shè)定的話,默認(rèn)用0填充)
printVector(v1);
v1.resize(5); //設(shè)定的大小長度為5
printVector(v1); //如果重新指定的長度比原來短了,超出部分會刪除掉
}
5. 數(shù)據(jù)存取
//對vector容器中的數(shù)據(jù)進(jìn)行存取操作
void test01()
{
vector<int> v1; //默認(rèn)構(gòu)造
for(int i=0;i<10;i++)
{
v1.push_back(i);
}
//利用[]方式訪問數(shù)組元素
for(int i=0;i<v1.size();i++)
{
cout<<v1[i]<<" ";
}
cout<<endl;
//利用at方式訪問元素
for(int i=0;i<v1.size();i++)
{
cout<<v1.at(i)<<" ";
}
cout<<endl;
//獲取第一個(gè)元素
cout<<"第一個(gè)元素為:"<<v1.front()<<endl;
//獲取最后一給元素
cout<<"最后一個(gè)元素為:"<<v1.back()<<endl;
}
6. 預(yù)留空間
void test01()
{
vector<int> v;
//預(yù)留空間
v.reserve(10000); //未加此行代碼前 num=15,即需要動態(tài)擴(kuò)展十五次 加此行代碼只需要1次,即起預(yù)留作用
int num=0;
int *p=NULL;
for(int i=0;i<10000;i++)
{
v.push_back(i);
if(p!=&v[0])
{
p=&v[0];
num++;
}
}
cout<<"num = "<<num<<endl;
}
7. 互換容器
void printVector(vector<int> &p)
{
for(vector<int>::iterator it=p.begin();it!=p.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
}
//vector 容器進(jìn)行插入、刪除操作
void test01()
{
cout<<"交換前:"<<endl;
vector<int> v1; //默認(rèn)構(gòu)造
for(int i=0;i<10;i++)
{
v1.push_back(i);
}
printVector(v1);
vector<int> v2; //默認(rèn)構(gòu)造
for(int i=9;i>=0;i--)
{
v2.push_back(i);
}
printVector(v2);
cout<<"交換后:"<<endl;
v1.swap(v2);
printVector(v1);
printVector(v2);
}
//實(shí)際用途
//巧用swap可以收縮內(nèi)存空間
void test02()
{
vector<int> v;
for(int i=0;i<10000;i++)
{
v.push_back(i);
}
cout<<"最初時(shí):"<<endl;
cout<<"v的容量為:"<<v.capacity()<<endl;
cout<<"v的大小為:"<<v.size()<<endl;
//重新指定大小
cout<<endl<<"重新指定大小后:"<<endl;
v.resize(3);
cout<<"v的容量為:"<<v.capacity()<<endl;
cout<<"v的大小為:"<<v.size()<<endl;
//巧用swap收縮內(nèi)存
cout<<endl<<"創(chuàng)建匿名對象進(jìn)行交換后:"<<endl;
vector<int>(v).swap(v); //創(chuàng)建匿名對象進(jìn)行交換,匿名對象最終會被系統(tǒng)自動釋放
cout<<"v的容量為:"<<v.capacity()<<endl;
cout<<"v的大小為:"<<v.size()<<endl;
}
原文鏈接:https://blog.csdn.net/Dustinthewine/article/details/125815141
相關(guān)推薦
- 2022-08-15 Redis緩存三大異常的處理方案梳理總結(jié)_Redis
- 2022-03-08 C#中BackgroundWorker類用法總結(jié)_C#教程
- 2022-10-17 Go使用select切換協(xié)程入門詳解_Golang
- 2022-03-28 詳解Asp.net?5中的ApplicationBuilder_基礎(chǔ)應(yīng)用
- 2024-01-11 源碼解析list.contains()方法,比較集合中的是存在某對象
- 2022-09-24 詳解ASP.NET中加密和解密的方法_實(shí)用技巧
- 2022-07-01 python神經(jīng)網(wǎng)絡(luò)Keras實(shí)現(xiàn)GRU及其參數(shù)量_python
- 2022-11-03 React狀態(tài)管理器Rematch的使用詳解_React
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支