網站首頁 編程語言 正文
定義:一個容器就是一個特定類型對象的集合。
順序容器概述
(1)順序容器類型
vector:可變數組大小,支持快速訪問
deque:雙端隊列,支持快速隨機訪問,在頭尾位置插入/刪除速度很快
forward_list:單向鏈表,只支持單向順序訪問。
array:固定大小數組,不能添加或刪除元素
string:和vector類似,用來保存字符
容器庫概覽
迭代器
迭代器范圍由一對迭代器表示,,通常被稱為begin和end,而end從來都不會指向范圍中的最后一個元素,而是指向尾元素之后的位置,其元素范圍由數學表示為:
[begin,end)
容器定義和初始化
(1)將一個容器初始化為另一個容器的拷貝
可拷貝整個容器,也可以拷貝一個指定容器的元素范圍
新容器和原容器的元素類型可以不同,只要能將要拷貝的元素轉換為要初始化的元素的類型即可
list<string> authors={"nuktib","sha"m"aus"}
vector<const char *> articles={"a","an","the"}
list<string> list2(authors); //正確,類型匹配
deque<string> authList(authors) //錯誤,容器類型不匹配
forward_list<string> words(articles.begin(),articles.end())
//上述正確,可以將const char*元素轉換為string
(2)與順序容器大小相關的構造函數
其中一個構造函數接收一個容器大小和一個元素初始值
list<string> i(10,"hi") //10個strings元素,每個都初始化為"hi"
vector<int> v(10,-1) //10個int元素,每個都初始化為-1
deque<string> i(10) //10個元素,每個都是空的string
(3)標準庫array具有固定大小
定義一個array時,除了指定元素類型,還要指定容器大小
array<int,42>
array<string,10>
內置數組不支持拷貝或對象賦值操作,但array無此限制
int digs[10]={1,2,3}
int cpy[10]=digs //錯誤,內置數組不支持拷貝和賦值
array<int,10> d={1,2,3,4,5,6,7}
array<int,10> c=d //正確
賦值和swap
(1) assign賦值函數(僅順序容器)
順序容器定義了一個名為assign的成員,允許我們從一個不同但相容的類型賦值,或者從一個容器的子序列賦值。
例:
list<string> name;
vector<const char*>old;
name.assign(old.cbegin(),old.cend())
上述代碼將name中的元素替換為迭代器指定范圍中的元素的拷貝,assign的參數決定了容器中將有多少個元素以及他們的值是什么
(2)使用swap
swap操作交換兩個相同類型容器的內容
vector<string> v1(10);
vector<string> v2(20);
上述交換結束后,v1將會擁有20個元素,v2將會擁有10個元素
順序容器操作
向順序容器添加元素
(1)使用push_back
除了array和forward_list之外,每個順序容器都支持push_back
(2)push_front
list,forward_list,deque容器還支持push_front將元素插入容器頭部
list<int> l;
for(int i=0;i!=4;i++)
l.push_front(i)
(3)在特定位置添加元素
insert函數可在特定位置添加元素,每個insert元素都接受一個迭代器作為其第一個參數,insert函數將元素插入到迭代器所指得位置之前
雖然有些容器不支持push_front操作,但他們對于insert操作無此限制,因此可以將元素插入到容器開始的位置,不必擔心容器是否支持push_front
insert另一個版本還接受一個元素數目和一個值,將指定數目的元素添加到指定位置之前。
s.insert(s.end(),10,"anna") //將10個元素插入到s的末尾
還可以接受一對迭代器或一個初始化列表插入
s.insert(s.end(),{"thses","as","sda","dasda"});
使用insert的返回值
list<string> l;
auto iter = l.begin();
string word;
while (cin >> word)
iter = l.insert(iter, word);
上述代碼實現在一個特定位置反復插入元素
第一次調用insert將剛剛讀取的string插入到iter所指向的元素之前,insert返回的迭代器恰好指向這個新元素,我們將此迭代器賦予iter并重新開始循環,讀取下一個單詞,不斷循環。
訪問元素
所有順序容器都存在一個front成員函數,,除了forward_list之外的所有順序容器都由一個back成員函數,front成員函數返回首元素的引用,back成員函數返回尾元素的引用
可以通過該引用修改容器中元素的值
if(!c.empty())
{
c.front()=42;
auto &v=c.back()
v=1024;
}
刪除元素
(1)pop_front和pop_back成員函數分別刪除首元素和尾元素,vector和string,forward_list不支持上述操作
(2)earse
成員函數erase從容器指定位置刪除元素,也可以刪除迭代器指定的單個元素,也可以刪除由一對迭代器指定的范圍內的所有元素,上述最終均會返回指向刪除的元素之后位置的迭代器。
例:刪除所有的奇數
list<int> ls = { 0,1,2,3,4,5,6,7,8,9 };
auto it = ls.begin();
while (it != ls.end())
{
if (*it % 2)
it = ls.erase(it);
else
it++;
}
接受一堆迭代器的erase版本允許我們刪除一個范圍內的元素:
例: s.erase(s.begin(),s.end())
特殊的forwa_list單向鏈表操作
單向鏈表中由于特殊的插入和刪除,所以定義的函數也比較特殊
before_begin():返回指向鏈表首元素之前不存在的元素的迭代器,此迭代器不能解引用
insert_after(p,t):在迭代器p之后插入元素t
erase_after(p):刪除p所指位置之后的元素
例:刪除奇數元素:
forward_list<int> lst = { 0,1,2,3,4,5,6,7,8,9 };
auto pre = lst.before_begin();
auto cur = lst.begin();
while (cur != lst.end())
{
if (*cur % 2)
cur = lst.erase_after(pre); //將cur重置為erase_after的返回值,即指向cur的下一個元素
else
{
pre = cur;
cur++;
}
}
改變容器大小
通過resize函數可以改變容器的大小,但array不支持此操作
c.resize(n):調整c為n個元素
c.resize(n,t):調整c為n個元素,任何新添加的元素都初始化為t
vector對象是如何增長的
為了支持隨機訪問,vector將元素連續存儲,當不得不獲取新的內存控件時,vector和string通常會分配比新的控件需求更大的內存控件,容器預留這些空間作為備用,可以保存更多元素。
capacity函數告訴我們容器在不擴張內存空間情況下可以容納多少元素
size():是指目前已經保存的元素的數目
reverse(n):告訴容器至少分配容納n給元素的空間
原文鏈接:https://blog.csdn.net/weixin_42375706/article/details/121208727
相關推薦
- 2022-04-06 一篇文章帶你深入學習Python函數_python
- 2022-10-28 Django靜態文件配置request對象方法ORM操作講解_python
- 2022-08-18 R語言使用cgdsr包獲取TCGA數據示例詳解_R語言
- 2022-07-04 python如何輸入根號_python
- 2022-04-28 Python語言中的數據類型-序列_python
- 2022-07-06 YOLOv5目標檢測之anchor設定_python
- 2021-12-10 通過docker容器搭建lamp架構的流程_docker
- 2022-06-27 Python使用re模塊實現okenizer(表達式分詞器)_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同步修改后的遠程分支