




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第C++順序容器(vector、deque、list)的使用詳解目錄一:STL(StandardTemplateLibrary),即標準模板庫,是一個高效的C++程序庫二:STL組件三:容器四:類型成員五:迭代器六:順序容器七:順序容器--向量(vector)八:順序容器--雙端隊列--deque九:順序容器--列表--list
一:STL(StandardTemplateLibrary),即標準模板庫,是一個高效的C++程序庫
1.從實現層次看,整個STL是以一種類型參數化(typeparameterized)的方式實現的,基于模板(template)。
2.從邏輯層次來看,在STL中體現了泛型化程序設計的思想(genericprogramming),在這種思想里,大部分基本算法被抽象,被泛化,獨立于與之對應的數據結構,用于以相同或相近的方式處理各種不同情形。
二:STL組件
1.Container(容器)各種基本數據結構
2.Algorithm(算法)各種基本算法如sortsearch等
3.Iterator(迭代器)連接containers和algorithms
4.了解:
Adapter(適配器)可改變containers或functionobject接口的一種組件Functionobject(函數對象)*Allocator(分配器)*
三:容器
1.容器類是容納、包含一組元素或元素集合的對象
2.七種基本容器:
向量(vector)、雙端隊列(deque)、鏈表(list)、集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)
四:類型成員
1.循環子操作:
begin():指向第一個元素end():指向最后一個元素的后一個位置rbegin():指向逆序的第一個元素rend():指向逆序的最后一個元素的后一個位置
2.訪問元素操作
front():訪問第一個元素back():訪問最后一個元素[]:無測試的下標訪問(不用于list)at():有測試的下標訪問(只用于vector和deque)
3.堆棧和隊列操作
push_back():將新元素加入到尾部pop_back():移出最后一個元素push_front():將新元素加入頭部(只用于list和deque)pop_front():移出第一個元素(只用于list和deque)
4.表操作
insert(p,x):將元素x加入到p之前erase(p):刪除p處的元素clear():清除所有的元素
五:迭代器
迭代器是面向對象版本的指針,它們提供了訪問容器、序列中每個元素的方法
六:順序容器
順序容器的接口
1.插入方法:push_front(),push_back(),insert(),運算符=
2.刪除方法:pop(),erase(),clear()
3.迭代訪問方法:使用迭代器
4.其他順序容器訪問方法(不修改訪問方法):front(),back(),下標[]運算符
七:順序容器--向量(vector)
a.向量屬于順序容器,用于容納不定長線性序列(即線性群體),提供對序列的快速隨機訪問(也稱直接訪問)
b.數據結構很像一個數組,所以與其他容器相比,vector能非常方便和高效訪問單個元素,支持隨機訪問迭代子
c.向量是動態結構,它的大小不固定,可以在程序運行時增加或減少
d.與數組不同,向量的內存用盡時,向量自動分配更大的連續內存區,將原先的元素復制到新的內存區,并釋放舊的內存區。這是向量類的優點。
頭文件:#includevector
例子:
1.push_back尾部添加
#includeiostream
usingnamespacestd;
#includevector
voiddemo_vector();
intmain()
demo_vector();
return0;
voiddemo_vector()
vectorint
//迭代器
vectorint::iteratorit;
it=v.begin();//開始位置
//在尾部添加
v.push_back(1);
v.push_back(12);
//迭代器指針遍歷向量容器
for(it=v.begin();itv.end();it++)
cout""*it;//取值
//112
coutendl;
2.insert按照位置插入
#includeiostream
usingnamespacestd;
#includevector
voiddemo_vector();
intmain()
demo_vector();
return0;
voiddemo_vector()
vectorint
//迭代器
vectorint::iteratorit;
it=v.begin();//開始位置
//在尾部添加
v.push_back(1);
v.push_back(12);
//按照位置插入
v.insert(v.begin(),100);
for(it=v.begin();itv.end();it++)
cout""*it;//取值
//100112
coutendl;
3.獲取id(成員屬性)
CStaff.h
#ifndefCSTAFF_H
#defineCSTAFF_H
#defineADMIN1
#defineMANAGER2
#defineWAITER3
#includestring
#includeiostream
usingnamespacestd;
classStaff
public:
Staff();
Staff(intid,stringname,stringpwd,intprole);
~Staff();
intgetId();
stringgetName();
stringgetPwd();
intgetRole();
private:
intID;
stringname;
stringpwd;
introle;
#endif
CStaff.cpp
#include"CStaff.h"
#includeiostream
usingnamespacestd;
Staff::Staff()
Staff::Staff(intid,stringname,stringpwd,intprole)
this-ID=id;
this-name=name;
this-pwd=pwd;
this-role=prole;
intStaff::getId()
returnthis-
stringStaff::getName()
returnthis-name;
stringStaff::getPwd()
returnthis-
intStaff::getRole()
returnthis-role;
Staff::~Staff()
main.cpp
#includeiostream
usingnamespacestd;
#include"CStaff.h"
#includevector
voiddemo_vector();
intmain()
demo_vector();
return0;
voiddemo_vector()
vectorStaff*staffV;
vectorStaff*::iteratorit;
staffV.push_back(newStaff(1001,"admin","1234",ADMIN));
staffV.push_back(newStaff(1002,"lily","1234",ADMIN));
staffV.insert(staffV.begin(),newStaff(1003,"sam","1234",MANAGER));
for(it=staffV.begin();itstaffV.end();it++)
cout"id:"(*it)-getId()endl;
//id:1003
//id:1001
//id:1002
4.按照位置插入insert---需要迭代器指針it++偏移
#includeiostream
usingnamespacestd;
#include"CStaff.h"
#includevector
voiddemo_vector();
intmain()
demo_vector();
return0;
voiddemo_vector()
vectorStaff*staffV;
vectorStaff*::iteratorit;
staffV.push_back(newStaff(1001,"admin","1234",ADMIN));
staffV.push_back(newStaff(1002,"lily","1234",ADMIN));
it=staffV.begin();//開始位置
it++;
staffV.insert(it,newStaff(1003,"sam","1234",MANAGER));
for(it=staffV.begin();itstaffV.end();it++)
cout"id:"(*it)-getId()endl;
//id:1001
//id:1003
//id:1002
5.尾部刪除pop_back
#includeiostream
usingnamespacestd;
#include"CStaff.h"
#includevector
voiddemo_vector();
intmain()
demo_vector();
return0;
voiddemo_vector()
vectorStaff*staffV;
vectorStaff*::iteratorit;
staffV.push_back(newStaff(1001,"admin","1234",ADMIN));
staffV.push_back(newStaff(1002,"lily","1234",ADMIN));
it=staffV.begin();//開始位置
it++;
//按照位置插入
staffV.insert(it,newStaff(1003,"sam","1234",MANAGER));
//尾部刪除
staffV.pop_back();
for(it=staffV.begin();itstaffV.end();it++)
cout"id:"(*it)-getId()endl;
//id:1001
//id:1003
6.erase按照位置刪除
#includeiostream
usingnamespacestd;
#include"CStaff.h"
#includevector
voiddemo_vector();
intmain()
demo_vector();
return0;
voiddemo_vector()
vectorStaff*staffV;
vectorStaff*::iteratorit;
staffV.push_back(newStaff(1001,"admin","1234",ADMIN));
staffV.push_back(newStaff(1002,"lily","1234",ADMIN));
it=staffV.begin();//開始位置
it++;
//按照位置插入
staffV.insert(it,newStaff(1003,"sam","1234",MANAGER));
//尾部刪除
staffV.pop_back();
it=staffV.begin();//開始位置
staffV.erase(it);//刪除第一個
for(it=staffV.begin();itstaffV.end();it++)
cout"id:"(*it)-getId()endl;
//id:1003
7.erase按照位置刪除(迭代器指針偏移it++)
#includeiostream
usingnamespacestd;
#include"CStaff.h"
#includevector
voiddemo_vector();
intmain()
demo_vector();
return0;
voiddemo_vector()
vectorStaff*staffV;
vectorStaff*::iteratorit;
staffV.push_back(newStaff(1001,"admin","1234",ADMIN));
staffV.push_back(newStaff(1002,"lily","1234",ADMIN));
it=staffV.begin();//開始位置
it++;
//按照位置插入
staffV.insert(it,newStaff(1003,"sam","1234",MANAGER));
//尾部刪除
staffV.pop_back();
it=staffV.begin();//開始位置
it++;
staffV.erase(it);//刪除第二個
for(it=staffV.begin();itstaffV.end();it++)
cout"id:"(*it)-getId()endl;
//id:1001
8.size計數
#includeiostream
usingnamespacestd;
#include"CStaff.h"
#includevector
voiddemo_vector();
intmain()
demo_vector();
return0;
voiddemo_vector()
vectorStaff*staffV;
vectorStaff*::iteratorit;
staffV.push_back(newStaff(1001,"admin","1234",ADMIN));
staffV.push_back(newStaff(1002,"lily","1234",ADMIN));
it=staffV.begin();//開始位置
it++;
//按照位置插入
staffV.insert(it,newStaff(1003,"sam","1234",MANAGER));
cout"員工數量:"staffV.size()endl;
for(it=staffV.begin();itstaffV.end();it++)
cout"id:"(*it)-getId()endl;
//員工數量:3
//id:1001
//id:1003
//id:1002
9.容器訪問四種
1.迭代器指針2.at訪問方式3.[]中括號訪問方式4.C++新增auto訪問方式
at訪問方式:
#includeiostream
usingnamespacestd;
#include"CStaff.h"
#includevector
voiddemo_vector();
intmain()
demo_vector();
return0;
voiddemo_vector()
vectorStaff*staffV;
vectorStaff*::iteratorit;
staffV.push_back(newStaff(1001,"admin","1234",ADMIN));
staffV.push_back(newStaff(1002,"lily","1234",ADMIN));
it=staffV.begin();//開始位置
it++;
//按照位置插入
staffV.insert(it,newStaff(1003,"sam","1234",MANAGER));
cout"員工數量:"staffV.size()endl;
/*for(it=staffV.begin();itstaffV.end();it++)//迭代器指針遍歷
cout"id:"(*it)-getId()endl;
for(inti=0;istaffV.size();i++)//下標法
cout"id:"staffV.at(i)-getId()endl;
//員工數量:3
//id:1001
//id:1003
//id:1002
[]中括號訪問方式
#includeiostream
usingnamespacestd;
#include"CStaff.h"
#includevector
voiddemo_vector();
intmain()
demo_vector();
return0;
voiddemo_vector()
vectorStaff*staffV;
vectorStaff*::iteratorit;
staffV.push_back(newStaff(1001,"admin","1234",ADMIN));
staffV.push_back(newStaff(1002,"lily","1234",ADMIN));
it=staffV.begin();//開始位置
it++;
//按照位置插入
staffV.insert(it,newStaff(1003,"sam","1234",MANAGER));
cout"員工數量:"staffV.size()endl;
/*for(it=staffV.begin();itstaffV.end();it++)//迭代器指針遍歷
cout"id:"(*it)-getId()endl;
for(inti=0;istaffV.size();i++)//下標法
//cout"id:"staffV.at(i)-getId()endl;
cout"id:"staffV[i]-getId()endl;
//員工數量:3
//id:1001
//id:1003
//id:1002
10.clear清空
#includeiostream
usingnamespacestd;
#include"CStaff.h"
#includevector
voiddemo_vector();
intmain()
demo_vector();
return0;
voiddemo_vector()
vectorStaff*staffV;
vectorStaff*::iteratorit;
staffV.push_back(newStaff(1001,"admin","1234",ADMIN));
staffV.push_back(newStaff(1002,"lily","1234",ADMIN));
it=staffV.begin();//開始位置
it++;
//按照位置插入
staffV.insert(it,newStaff(1003,"sam","1234",MANAGER));
cout"員工數量:"staffV.size()endl;
/*for(it=staffV.begin();itstaffV.end();it++)//迭代器指針遍歷
cout"id:"(*it)-getId()endl;
for(inti=0;istaffV.size();i++)//下標法
//cout"id:"staffV.at(i)-getId()endl;
cout"id:"staffV[i]-getId()endl;
staffV.clear();
cout"員工數量:"staffV.size()endl;
//員工數量:3
//id:1001
//id:1003
//id:1002
//員工數量:0
八:順序容器--雙端隊列--deque
a.雙端隊列是一種放松了訪問權限的隊列。元素可以從隊列的兩端入隊和出隊,也支持通過下標操作符[]進行直接訪問。
b.與向量的對比功能上:和向量沒有多少區別,
性能上:在雙端隊列起點上的插入和刪除操作快
頭文件:#includedeque
1.push_front頭部插入
#includeiostream
usingnamespacestd;
#include"CStaff.h"
#includevector
#includedeque
voiddemo_deque();
intmain()
demo_deque();
return0;
voiddemo_deque()
dequeStaff*staffV;
dequeStaff*::iteratorit;
staffV.push_back(newStaff(1001,"admin","1234",ADMIN));
staffV.push_back(newStaff(1002,"lily","1234",ADMIN));
it=staffV.begin();//開始位置
it++;
//按照位置插入
staffV.insert(it,newStaff(1003,"sam","1234",MANAGER));
//頭部插入
staffV.push_front(newStaff(1004,"lilei","1234",MANAGER));
cout"員工數量:"staffV.size()endl;
/*for(it=staffV.begin();itstaffV.end();it++)//迭代器指針遍歷
cout"id:"(*it)-getId()endl;
for(inti=0;istaffV.size();i++)//下標法
//cout"id:"staffV.at(i)-getId()endl;
cout"id:"staffV[i]-getId()endl;
//staffV.clear();
//cout"員工數量:"staffV.size()endl;
//員工數量:4
//id:1004
//id:1001
//id:1003
//id:1002
2.pop_front頭部刪除
#includeiostream
usingnamespacestd;
#include"CStaff.h"
#includevector
#includedeque
voiddemo_deque();
intmain()
demo_deque();
return0;
voiddemo_deque()
dequeStaff*staffV;
dequeStaff*::iteratorit;
staffV.push_back(newStaff(1001,"admin","1234",ADMIN));
staffV.push_back(newStaff(1002,"lily","1234",ADMIN));
//頭部插入
staffV.push_front(newStaff(1004,"lilei","1234",MANAGER));
it=staffV.begin();//開始位置
//it++;
//按照位置插入
staffV.insert(it,newStaff(1003,"sam","1234",MANAGER));//3412
staffV.pop_front();//頭部刪除
cout"員工數量:"staffV.size()endl;
/*for(it=staffV.begin();itstaffV.end();it++)//迭代器指針遍歷
cout"id:"(*it)-getId()endl;
for(inti=0;istaffV.size();i++)//下標法
//cout"id:"staffV.at(i)-getId()endl;
cout"id:"staffV[i]-getId()endl;
//staffV.clear();
//cout"員工數量:"staffV.size()endl;
//員工數量:3
//id:1004
//id:1001
//id:1002
九:順序容器--列表--list
a.鏈表主要用于存放雙向鏈表,可以從任意一端開始遍歷。鏈表還提供了拼接(splice)操作,將一個序列中的元素從插入到另一個序列中。
b.對比:元素的插入和刪除操作對list而言尤為高效
與vector和deque相比,對元素的下標訪問操作的低效是不能容忍的,因此list不提供這類操作。
頭文件:#includelist
list只支持迭代器法
for(it=staffList.begin();it!=staffList.end();it++)//迭代器指針遍歷
1.只支持迭代器指針遍歷
#includeiostream
usingnamespacestd;
#include"CStaff.h"
#includevector
#includedeque
#includelist
voiddemo_list();
intmain()
demo_list();
return0;
voiddemo_list()
listStaff*staffList;
listStaff*::iteratorit;
staffList.push_back(newStaff(1001,"admin","1234",ADMIN));
staffList.push_back(newStaff(1002,"lily","1234",ADMIN));
//頭部插入
staffList.push_front(newStaff(1004,"lilei","1234",MANAGER));
it=staffList.begin();//開始位置
//it++;
//按照位置插入
staffList.insert(it,newStaff(1003,"sam","1234",MANAGER));//3412
staffList.pop_front();//頭部刪除
cout"員工數量:"staffList.size()endl;
for(it=staffList.begin();it!=staffList.end();it++)//迭代器指針遍歷
cout"id:"(*it)-getId()endl;
//員工數量:3
//id:1004
//id:1001
//id:1002
2.把一個鏈表(單個元素)里的東西放到另外一個鏈表中--splice
#includeiostream
usingnamespacestd;
#include"CStaff.h"
#includevector
#includedeque
#includelist
voiddemo_list();
intmain()
demo_list();
return0;
voiddemo_list()
listStaff*staffList;
listStaff*list2;//再一個鏈表
list2.push_back(newStaff(1006,"mei","1234",ADMIN));//有一個1006
staffList.push_back(newStaff(1001,"admin","1234",ADMIN));
staffList.push_back(newStaff(1002,"lily","1234",ADMIN));
//頭部插入
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電梯困人培訓方案
- 初一寒假安全教育主題班會
- 護士入崗前教育
- 讀單詞游戲設計
- 頤和園說課課件
- 體育運動中燙燒傷防護與處理
- 頸椎的護理課件
- 界面設計風格解析與應用
- 《智能網聯汽車技術》課件-自動駕駛等級劃分的認知
- 預防流感主題班會課件
- 股東出資情況表模板
- 甘肅省天水市甘谷縣第一中學2025屆物理高一下期末質量檢測試題含解析
- GB/T 4074.5-2024繞組線試驗方法第5部分:電性能
- 熱水袋燙傷RCA分析2022
- 業主提前裝修免責協議
- 2024年上海市計算機一級考試復習題庫(含答案)
- 新生兒吸痰護理課件
- 礦井通風工技師(高級技師)理論考試題庫
- 《急救知識普及》課件
- 《應急救援知識》課件
- 智慧物業管理方案
評論
0/150
提交評論