程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++容器學習,容器

C++容器學習,容器

編輯:C++入門知識

C++容器學習,容器


以前自學C++的時候就沒怎麼看容器,一直以來也沒怎麼編過C++程序,現在想用C++寫點東西,突感容器類型有些生疏,故做此筆記。(參考《C++ primer》

容器:容納特定類型對象的集合。(定義很重要)

順序容器:將單一元素聚集起來,根據位置來存儲和訪問元素。

標准庫定義了三種容器:vector、list、deque

順序容器適配器:stack、queue、priority_queue

順序容器   vector 支持快速隨機訪問 list 支持快速插入、刪除 deque 雙端隊列 適配器   stack LIFO queue FIFO priority_queue 有優先級管理的隊列

容器初始化:

C<T> c;  初始化一個空的容器

C c(c2);  用已有容器初始化,要求c2類型與C的類型要相同

C c(b,e);  用迭代器范圍或指針初始化,b,e指代對象的類型可與C不同

C c(n,t);  新容器有n個元素,每個初始化為t。(只適用於順序容器,並要求元素類提供一個參數的構造函數)

C c(n);    新容器有n個元素(只適用於順序容器,需要提供默認構造函數)

容器內元素的類型約束:1)、必須支持賦值運算;2)、必須可以復制;

指定容器的容器時:vector< vector<string> > lines; 要注意留空格;

迭代器和迭代器范圍:

形如:vector<int>::iterator iter; //iter 相當於指針

*iter iter所指向元素的引用 iter->mem 解引用,獲取指定元素中名為mem的成員 ++iter、iter++或-- 自加減 ==、!= 關系操作符 只適用於vector、deque +、-、+=、-=等算術運算 只適用於vector、deque

注意:list的迭代器既不支持自述運算也不支持關系運算,它只提供前置和後置的自增、自減運算及相等、不等運算。

添加元素

c.push_back(t) 在末尾添加t c.push_front(t) 在首部添加t,只適用於list和deque c.insert(p,t) 在迭代器p前面搬遷 t,返回新加元素的迭代器 c.insert(p,n,t) 在p前插入n個t,返回void c.insert(p,b,e) 在p前插入b,b指代的范圍內元素,返回void

注意:任何insert和push操作都可能導致迭代器失效,當編寫循環將元素插入到vector或deque中時,程序必須確保迭代器在每次循環後都得到更新。所以不要存儲end操作返回的迭代器。

大小操作:

c.size() c.max_size() c.empty() c.resize(n) 調整大小,填0或刪除多余元素 c.resize(n,t) 調整大小,新元素賦值t

訪問元素:

c.back() 返回最後一個元素的引用 c.front() 第一個元素的引用 c[n] 下標訪問。只適用於vector和deque c.at(n) 返回下標。如果下標無效會拋出異常。同樣只適用於vector和deque

刪除元素:

c.erase(p) 刪除迭代器p處元素,返回指向後一元素的迭代器 c.erase(b,e) 刪除迭代器標記的范圍的所有元素 c.clear() c.pop_back() 刪除最後一個元素 c.pop_front() 刪除第一個元素,只適用於list或deque

賦值操作:

c1=c2

c1.swap(c2) 交換內容(原迭代器不會失效) c.assign(b,e) c.assign(n,t) c重新設置為n個t值元素

vector的自增長:

vector每次調整容量為增加至當前容量的3/2。

 

容器的區別:

vector、deque:存儲空間連續,對元素可以快速隨機訪問,vector在尾部插入刪除很快速,但在其他位置插刪效率較低,deque與vector類似,但在首尾的插刪都很快速。

list:用鏈表組織元素,所以不支持隨機訪問,但在任意位置插刪開銷較小。

注意:編寫代碼時嘗試只使用vector和list容器都能提供的操作,使用迭代器,而不是使用下標並避免隨機訪問元素。這樣在必要時,可很方便地將程序從使用vector容器修改為使用list容器。

適配器區別:

stack棧可以建立在vector、list或deque容器之上;

queue要求其基礎容器提供push_front運算,因此只能建立在list容器上;

priority_queue要求提供隨機訪問功能,因此可建立在vector、deque上。

棧:

支持查詢是否為empty(),以及大小size(),還有pop():刪除棧頂;top():返回棧頂元素;push():壓入新元素

隊列和優先線隊列:

隊列:FIFO

優先級隊列:將新元素根據優先級,放在比新元素優先級低的元素的前面。

支持的函數:empty(); size(); pop(); front():返回隊首元素,只適用於隊列;back():返回隊尾元素,只適用於隊列;top():返回最高優先級元素值,只適用於優先級隊列;push();

string類型

string可以看成一個特殊的容器,其操作很多與vector容器類似。

但,在string中不支持棧方式的操作,即不能使用front、back和pop_back操作。

當然,string還提供了其他很多容器所沒有的函數,如append、replace、find、find_first_of、find_first、compare等等。


實驗時,不宜用作化學反應容器的儀器是?A燒杯B燒瓶C試管D量筒

D

C語言的queue函數,誰可以講下,給個學習鏈接也行

queue 模板類定義<queue>頭文件
與stack 模板類相似queue 模板類也需要兩模板參數元素類型容器類
元素類型必要容器類型默認deque 類型
定義queue 對象示例代碼下:
queue<int> q1;
queue<double> q2;
queue 基本操作有:
入隊例:q.push(x); x 接隊列末端
出隊例:q.pop(); 彈出隊列元素注意會返回被彈出元素
訪問隊首元素例:q.front()早被壓入隊列元素
訪問隊尾元素例:q.back()被壓入隊列元素
判斷隊列空例:q.empty()當隊列空時返回true
訪問隊列元素例:q.size()

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved