C++順序容器(vector、deque、list)的使用詳解_第1頁
C++順序容器(vector、deque、list)的使用詳解_第2頁
C++順序容器(vector、deque、list)的使用詳解_第3頁
C++順序容器(vector、deque、list)的使用詳解_第4頁
C++順序容器(vector、deque、list)的使用詳解_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第C++順序容器(vector、deque、list)的使用詳解目錄一:STL(StandardTemplateLibrary),即標準模板庫,是一個高效的C++程序庫二:STL組件三:容器四:類型成員五:迭代器六:順序容器七:順序容器--向量(vector)八:順序容器--雙端隊列--deque九:順序容器--列表--list

一:STL(StandardTemplateLibrary),即標準模板庫,是一個高效的C++程序庫

1.從實現(xiàn)層次看,整個STL是以一種類型參數(shù)化(typeparameterized)的方式實現(xiàn)的,基于模板(template)。

2.從邏輯層次來看,在STL中體現(xiàn)了泛型化程序設(shè)計的思想(genericprogramming),在這種思想里,大部分基本算法被抽象,被泛化,獨立于與之對應(yīng)的數(shù)據(jù)結(jié)構(gòu),用于以相同或相近的方式處理各種不同情形。

二:STL組件

1.Container(容器)各種基本數(shù)據(jù)結(jié)構(gòu)

2.Algorithm(算法)各種基本算法如sortsearch等

3.Iterator(迭代器)連接containers和algorithms

4.了解:

Adapter(適配器)可改變containers或functionobject接口的一種組件Functionobject(函數(shù)對象)*Allocator(分配器)*

三:容器

1.容器類是容納、包含一組元素或元素集合的對象

2.七種基本容器:

向量(vector)、雙端隊列(deque)、鏈表(list)、集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap)

四:類型成員

1.循環(huán)子操作:

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():清除所有的元素

五:迭代器

迭代器是面向?qū)ο蟀姹镜闹羔槪鼈兲峁┝嗽L問容器、序列中每個元素的方法

六:順序容器

順序容器的接口

1.插入方法:push_front(),push_back(),insert(),運算符=

2.刪除方法:pop(),erase(),clear()

3.迭代訪問方法:使用迭代器

4.其他順序容器訪問方法(不修改訪問方法):front(),back(),下標[]運算符

七:順序容器--向量(vector)

a.向量屬于順序容器,用于容納不定長線性序列(即線性群體),提供對序列的快速隨機訪問(也稱直接訪問)

b.數(shù)據(jù)結(jié)構(gòu)很像一個數(shù)組,所以與其他容器相比,vector能非常方便和高效訪問單個元素,支持隨機訪問迭代子

c.向量是動態(tài)結(jié)構(gòu),它的大小不固定,可以在程序運行時增加或減少

d.與數(shù)組不同,向量的內(nèi)存用盡時,向量自動分配更大的連續(xù)內(nèi)存區(qū),將原先的元素復制到新的內(nèi)存區(qū),并釋放舊的內(nèi)存區(qū)。這是向量類的優(yōu)點。

頭文件:#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計數(shù)

#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"員工數(shù)量:"staffV.size()endl;

for(it=staffV.begin();itstaffV.end();it++)

cout"id:"(*it)-getId()endl;

//員工數(shù)量: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"員工數(shù)量:"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;

//員工數(shù)量: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"員工數(shù)量:"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;

//員工數(shù)量: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"員工數(shù)量:"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"員工數(shù)量:"staffV.size()endl;

//員工數(shù)量:3

//id:1001

//id:1003

//id:1002

//員工數(shù)量:0

八:順序容器--雙端隊列--deque

a.雙端隊列是一種放松了訪問權(quán)限的隊列。元素可以從隊列的兩端入隊和出隊,也支持通過下標操作符[]進行直接訪問。

b.與向量的對比功能上:和向量沒有多少區(qū)別,

性能上:在雙端隊列起點上的插入和刪除操作快

頭文件:#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"員工數(shù)量:"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"員工數(shù)量:"staffV.size()endl;

//員工數(shù)量: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"員工數(shù)量:"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"員工數(shù)量:"staffV.size()endl;

//員工數(shù)量: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"員工數(shù)量:"staffList.size()endl;

for(it=staffList.begin();it!=staffList.end();it++)//迭代器指針遍歷

cout"id:"(*it)-getId()endl;

//員工數(shù)量: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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論