c array容器 傳參 順序容器

2021-10-11 09:04:48 字數 4115 閱讀 9124

容器:特定型別物件的集合。標準庫定義了兩種容器:順序容器和關聯容器

順序容器:元素排列的順序不依賴元素值大小,而是由元素新增到容器的順序決定。

順序容器型別:vector list(雙向鍊錶) forward_list(單向鍊錶) deque(雙端佇列) array(固定大小陣列) string(字串)

vector string 隨機訪問速度快 :類似陣列結構,可以進行下標運算子

list forward_list 新增、插入、刪除元素速度快:鍊錶執行新增、插入、刪除元素的時間複雜度為o(n)。

容器的元素可以是另一型別的容器:例:vector> l;

迭代器

n:在我理解中,迭代器相當於指向特定容器型別的指標,很多容器的操作都是通過解引用迭代器實現的。

迭代器範圍:由一對迭代器表示[r.begin,r.end),begin迭代器

p:注意該範圍是乙個左閉合右開區間,end()迭代器是尾後迭代器

cbegin,cend帶c的迭代器是過載函式:

物件是const型別,返回const_iterator型別物件

物件是非常量型別,返回iterator型別

容器初始化:

1. 拷貝初始化:一容器建立為另一容器的拷貝,string c1=c2 or string c1(c2)

p:執行拷貝初始化時,兩容器的型別和元素型別必須匹配

2. 列表初始化:例:list names=;//列表初始化通常通過{}實現。

array容器定義時還需要指定容器的大小:例:arraya;

容器賦值運算:

c1=c2;//大小相等,c1元素為c2的拷貝

c1=;//大小不等,c1容器大小變成右邊容器的大小

swap和assign操作:

swap(c1,c2) ;//c1元素為c2的拷貝

assign:a.assign(b,e)//b、e為迭代器範圍

a.assign(c)//c為初始化列表

順序容器的操作:

1.新增元素:

insert:

c.insert(p,t); //在迭代器p所指向的元素前面插入值為t的新元素。返回指向新新增元素的迭代器

c.insert(p,n,t); //在迭代器p所指向的元素前面插入n個值為t的新元素。返回void型別

c.insert(p,b,e); //在迭代器p所指向的元素前面插入由迭代器b和e標記的範圍內的元素。返回void型別

新標準emplace:

emplace_front 和emplace和 emplace_back操作分別對應push_front 和insert 和push_back

呼叫push和insert成員操作是將元素型別的物件拷貝到引數中,而呼叫emplace是將引數傳遞給元素型別的建構函式

push_back:c.push_back(); //在容器c的尾部新增值為t的元素。返回void型別

push_front:c.push_front(t);//在容器c的前端新增值為t的元素。返回void型別。只適用於list和deque容器型別

n:forward_list不支援**(push_back和emplace_back),vector和string不支援前入(push_front和empalce_front)

向乙個 vector ,string 或 deque 插入元素會使所有指向容器的迭代器,引用,指標失效.

用乙個物件來初始化容器或者插入乙個物件,實際上放入容器的都是物件的拷貝.

2.訪問元素:

c.back(); //返回容器c的最後乙個元素的引用。如果c為空,則該操作未定義

c.front();// 返回容器c的第乙個元素的引用。如果c為空,則該操作未定義

c[n];//返回下標為n的元素的引用。如果n<0或n>=c.size(),則該操作未定義。只適用於vector和deque容器

c.at(n);//返回下標為n的元素的引用。如果下標越界,則該操作未定義。只適用於vector和deque容器

front,back,c[n],c.at(n)返回的都是引用,引用可以改變容器元素的值,而拷貝則不行。

3.刪除元素:

c.erase(p);//刪除迭代器p指向的元素。返回乙個迭代器,它指向被刪除元素後面的元素。如果p指向容器內最後乙個元素,則返回的迭代器指向容器的超出末端的下一位置。

如果p本身就是超出容器末端的下乙個位置,則該函式未定義

c.erase(b,e); //刪除迭代器b和e所標記的範圍內所有元素。返回乙個迭代器,它指向被刪除元素段後面的元素。如果e本身就是指向超出容器末端的下乙個位置,

則返回的迭代器也指向容器末端的下乙個位置

c.clear();//刪除容器c內的所有元素。返回void

c.pop_back();//刪除容器c的最後乙個元素。返回void。如果容器為空,則該函式未定義

c.pop_front();//刪除容器c的第乙個元素。婦女會void。如果容器為空,則該函式未定義。只適用於list和deque容器

forward_list有特殊版本的erase,且不支援pop_back操作

4.其他操作

容器大小:

c.size(); //返回容器c中元素的個數。返回型別為c::size_type

c.max_size(); //返回容器c可以容納的最多的元素個數.返回型別為c::size_type

c.empty(); // 返回標記容器大小是否為0的布林值

c.resize(n); // 調整容器c的長度大小,使其能容納n個元素。如果nc.resize(n,t); //調整容器c的大小,使其能容納n個元素。所有新新增的元素值為t

容器介面卡:

什麼是容器介面卡?容器介面卡有什麼用?:一種容器介面卡接受一種已有的容器型別,使其行為像另一種容器型別。

舉個簡單的例子,我們手機充電的時候需要電源介面卡來把220v的交流電轉換成較低電壓的直流電以供手機充電使用,220v的電壓太高了,我們不需要那麼高的電壓,而且高電壓還有可能產生其他很多不良後果。原有的基礎容器就相當於220v高壓,基礎容器能夠提供許多介面,而我們只需其中幾種操作,例如我們只需要20v電壓,容器介面卡就相當於電源介面卡,它只提供基礎容器中的部分介面。

標準庫定義了三種容器介面卡:stack,queue和priority_queue,stack和queue基於deque實現,priority_queue基於vector實現。

1.stack

stacks;

stack< int, vector> stk; //覆蓋基礎容器型別,使用vector實現stk

s.empty(); //判斷stack是否為空,為空返回true,否則返回false

s.size(); //返回stack中元素的個數

s.pop(); //刪除棧頂元素,但不返回其值

s.top(); //返回棧頂元素的值,但不刪除此元素

s.push(item); //在棧頂壓入新元素item

2.queue & priority_queue

queueq; //priority_queueq;

q.empty(); //判斷佇列是否為空

q.size(); //返回佇列長度

q.push(item); //對於queue,在隊尾壓入乙個新元素

//對於priority_queue,在基於優先順序的適當位置插入新元素

//queue only:

q.front(); //返回隊首元素的值,但不刪除該元素

q.back(); //返回隊尾元素的值,但不刪除該元素

//priority_queue only:

q.top(); //返回具有最高優先順序的元素值,但不刪除該元素

c++ primer 第五版

相關部落格

容器 順序容器

容器 include include include 容器元素型別必須滿足 1.支援賦值運算 2.物件可以複製 而io庫型別這兩個都不支援,因此,不能建立存放io型別物件的容器 容器的容器 記得加空格 list vector a list容器迭代器不支援演算法運算 也不支援關係運算 等,它只有自增,...

容器 順序容器 關聯容器

容器分為 順序容器 關聯容器,示意圖如下 順序容器 只儲存值,關聯容器 key value形式,關聯容器的乙個元素包含兩個部分 鍵值對 key value 有序容器 底層實現為紅黑樹,即容器內的key是有序的 無序容器 底層實現為hash table,雜湊表 區別 順序容器通過元素在容器中的位置順序...

stl容器之順序容器

stl容器分為順序容器和關聯容器 其中順序容器最常用的由vector,list,queue 1.vector vector 向量容器,可以看作變長陣列,長度可根據需要自行變化。使用的標頭檔案 include 定義方式 vector陣列名 vectorar 訪問容器內資料的方式和普通陣列相同,可以用a...