網站首頁 編程語言 正文
文章目錄
- 一、Vector容器簡介
- 二、基本操作
- 三、代碼實現
- 1. 構造函數
- 2. 賦值
- 3. 插入和刪除
- 4. 容量和大小
- 5. 數據存取
- 6. 預留空間
- 7. 互換容器
一、Vector容器簡介
vector是 C++ 標準模板庫 中的部分內容,中文偶爾譯作“容器”,但并不準確。 它是一個多功能的,能夠操作多種數據結構和算法的模板類和函數庫。 vector之所以被認為是一個容器,是因為它能夠像容器一樣存放各種類型的對象,簡單地說,vector是一個能夠存放任意類型的 動態數組 ,能夠增加和壓縮數據。
容器特性
-
順序序列
順序容器中的元素按照嚴格的線性順序排序??梢酝ㄟ^元素在序列中的位置訪問對應的元素。 -
動態數組
支持對序列中的任意元素進行快速直接訪問,甚至可以通過指針算述進行該操作。提供了在序列末尾相對快速地添加/刪除元素的操作。 -
能夠感知內存分配器的(Allocator-aware)
容器使用一個內存分配器對象來動態地處理它的存儲需求。
二、基本操作
- 構造函數
// vector<T> v; 采用模板實現類實現,默認構造函數
// vector(v.begin(),v.end()); 將v[begin(),end())區間中的元素拷貝給本身
// vector(n,elem); 構造函數將n個elem拷貝給本身
// vector(const vector &vec); 拷貝構造函數
- 賦值
//總結:vector賦值方式比較簡單,使用operator=或者assign都可以
// 給vector容器進行賦值
// vector &operator=(const vector &vec); 重載等號操作符
// assign(beg,end); 將[begin(),end())區間中的數據拷貝賦值給本身
// assign(n,elem); 將n個elem拷貝賦值給本身
- 插入和刪除
// push_back(ele); 尾部插入元素ele
// pop_back(); 刪除最后一個元素
// insert(const_iterator pos,ele); 迭代器指向位置pos插入元素ele
// insert(const_iterator pos,int count,ele); 迭代器指向位置pos插入count個元素ele
// erase(const_iterator pos); 刪除迭代器指向的元素
// erase(const_iterator start,coust_iterator end); 刪除迭代器從start到end之間的元素
// clear(); 刪除容器中所有元素
- 容量和大小
// empty(); 判斷容器是否為空
// capacity(); 容器的容量
// size(); 返回容器中元素的個數
// resize(int num); 重新指定容器的長度為num,若容器變長,則以默認值填充新位置
// 若容器變短,則末尾超出容器長度的元素被刪除
// resize(int num,elem); 重新指定容器的長度為num,若容器變長,則以elem值填充新位置
// 若容器變短,則末尾超出容器長度的元素被刪除
- 數據存取
// at(int idx); 返回索引idx所指的數據
// operator[]; 返回索引idx所指的數據
// front(); 返回容器中第一個數據元素
// back(); 返回容器中最后一個數據元素
- 預留空間
//總結: 如果數據量較大時,可以一開始利用reserve 預留空間
//減少vector在動態擴展容量時的擴展次數
// reserve(int len); 容器預留len個元素長度,預留位置不初始化,元素不可訪問
- 互換容器
// swap(vwc); 將vec與本身的元素互換
三、代碼實現
1. 構造函數
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; //默認構造
for(int i=0;i<10;i++)
{
v1.push_back(i); //后插入數值
}
printVector(v1);
//通過區間方式進行構造
vector<int> v2(v1.begin(),v1.end()); //將v1的值賦給v2
printVector(v2);
//n個elem方式構造
vector<int> v3(10,100); //將10個為100的數值 賦給v3
printVector(v3);
//拷貝構造
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; //默認構造
for(int i=0;i<10;i++)
{
v1.push_back(i); //后插入數值
}
printVector(v1);
//賦值 operator=
vector<int> v2;
v2=v1;
printVector(v2);
//assign
vector<int> v3;
v3.assign(v1.begin(),v1.end()); //利用assign區間方式(左閉右開) 將v1賦值給v3
printVector(v3);
//n個elem方式賦值
vector<int> v4;
v4.assign(10,100); //10個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 容器進行插入、刪除操作
void test01()
{
vector<int> v1; //默認構造
//尾插
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);
//插入 第一個參數是迭代器
v1.insert(v1.begin(),100); //在開頭位置插入100
printVector(v1);
v1.insert(v1.begin(),2,1000); //在開頭位置插入兩個1000
printVector(v1);
//刪除 參數是迭代器
v1.erase(v1.begin()); //刪除開頭第一個元素
printVector(v1);
//清空
// v1.erase(v1.begin(),v1.end()); //刪除從開頭到最后一個元素
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; //默認構造
for(int i=0;i<10;i++)
{
v1.push_back(i); //后插入數值
}
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); //利用重載版本,可以指定默認填充值 這里設定的大小長度為15,長出的部分用100填充(不設定的話,默認用0填充)
printVector(v1);
v1.resize(5); //設定的大小長度為5
printVector(v1); //如果重新指定的長度比原來短了,超出部分會刪除掉
}
5. 數據存取
//對vector容器中的數據進行存取操作
void test01()
{
vector<int> v1; //默認構造
for(int i=0;i<10;i++)
{
v1.push_back(i);
}
//利用[]方式訪問數組元素
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;
//獲取第一個元素
cout<<"第一個元素為:"<<v1.front()<<endl;
//獲取最后一給元素
cout<<"最后一個元素為:"<<v1.back()<<endl;
}
6. 預留空間
void test01()
{
vector<int> v;
//預留空間
v.reserve(10000); //未加此行代碼前 num=15,即需要動態擴展十五次 加此行代碼只需要1次,即起預留作用
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 容器進行插入、刪除操作
void test01()
{
cout<<"交換前:"<<endl;
vector<int> v1; //默認構造
for(int i=0;i<10;i++)
{
v1.push_back(i);
}
printVector(v1);
vector<int> v2; //默認構造
for(int i=9;i>=0;i--)
{
v2.push_back(i);
}
printVector(v2);
cout<<"交換后:"<<endl;
v1.swap(v2);
printVector(v1);
printVector(v2);
}
//實際用途
//巧用swap可以收縮內存空間
void test02()
{
vector<int> v;
for(int i=0;i<10000;i++)
{
v.push_back(i);
}
cout<<"最初時:"<<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收縮內存
cout<<endl<<"創建匿名對象進行交換后:"<<endl;
vector<int>(v).swap(v); //創建匿名對象進行交換,匿名對象最終會被系統自動釋放
cout<<"v的容量為:"<<v.capacity()<<endl;
cout<<"v的大小為:"<<v.size()<<endl;
}
原文鏈接:https://blog.csdn.net/Dustinthewine/article/details/125815141
- 上一篇:Stack和Queue容器的系列操作( 詳解 )
- 下一篇:CSS基礎語法和盒模型
相關推薦
- 2022-10-18 C++示例分析內聯函數與引用變量及函數重載的使用_C 語言
- 2022-06-16 C#實現二叉查找樹_C#教程
- 2022-10-19 Android項目中引入aar包的正確方法介紹_Android
- 2024-04-05 springboot注冊攔截器與返回統一標準響應格式
- 2022-12-08 C#調用C++?DLL?bool返回值始終為true的問題_C#教程
- 2022-06-02 Pandas實現DataFrame的簡單運算、統計與排序_python
- 2022-11-23 GoLang?unsafe包詳細講解_Golang
- 2023-03-16 Python庫functools示例詳解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支