對於c++容器的使用方法,自己一直迷迷糊糊。不是說不理解,只是老是會忘記,所以在這做乙個總結,記錄下各個容器常用的方法,來提醒自己。
主要是迭代器方面,以及size方法。
//假設容器變數為con
//得到首尾迭代器,返回型別為iterator
con.begin(), con.end();
//得到首尾常量迭代器,返回型別為const_iterator
con.cbegin(), con.cbegin();
//得到首尾逆迭代器,返回型別為reverse_iterator, forward_list沒有該方法
con.rbegin(), con.rend();
//得到容器內元素個數,forward_list沒有該方法
con.size();
//清空容器,array沒有該方法
con.clear();
跟c-style的陣列類似,但更安全,並且可以使用標準演算法
//包含標頭檔案
#include
//建立乙個固定大小的array,跟陣列類似,這個大小不可改變
array
ary;
//或at訪問對應位置的元素,at比安全,因為at進行下標檢查
ary[0] == ary.at(0);
向量,動態陣列,可自動擴充容量。隨機訪問快,除尾部之外的增刪慢。
//需要包含標頭檔案
#include
//建立乙個可容納int的vector,其他型別類似
vector
vec;
//末尾新增乙個元素
vec.push_back(1);
//從末尾刪去乙個元素
vec.pop_back();
//在指定位置插入乙個元素, 第乙個元素為vector::const_iterator型別
//insert採用拷貝的方式新增元素,emplace則採用直接構造的方式新增元素
vec.insert(vec.cbegin(), 0);
vec.emplace(vec.cbegin(), 0);
//刪去指定位置的元素,引數為vector::const_iterator型別
vec.erase(vec.cbegin());
//使用下標或者使用at訪問對應位置的元素
vec[0] == vec.at(0);
雙向動態陣列,可以看成是vector的雙向版
//需要包含的標頭檔案
#include
//建立可容納int元素的deque
deque
dq;
//頭插和頭刪
dq.push_front(1), dq.pop_front();
//尾插和尾刪
dq.push_back(2), dq.pop_back();
//在指定位置插入
dq.insert(dq.cbegin(), 1);
dq.emplace(dq.cbegin(), 1);
//刪除指定位置的元素
dq.erase(dq.cbegin());
//使用下標或at訪問指定位置的元素
dq[0] == dq.at(0);
單向鍊錶,唯一不提供size()方法,並且插入和刪除都是在給定位置之後。
//包含標頭檔案
#include
//建立可以容納int元素的forward_list
forward_listfl;
//頭插和頭刪
fl.push_front(2);
fl.pop_front();
//插入指定位置之後的元素,在這裡,如果fl非空,則2成為第二個元素
fl.insert_after(fl.cbegin(), 2);
fl.emplace_after(fl.cbegin(), 2);
//刪除指定位置之後的元素,在這裡,刪除第二個元素
fl.erase_after(fl.cbegin());
雙向鍊錶,支援雙向插入刪除,只支援順序訪問,增刪快。
//需要包含標頭檔案
#include
//建立乙個容納int的list
list
lst;
//頭插或尾插
lst.push_front(1), lst.push_back(2);
//頭刪或尾刪
lst.pop_front(), lst.pop_back();
//在指定位置插入
lst.insert(lst.cbegin(), 1);
lst.emplace(lst.cbegin(), 1);
//在指定位置刪除
lst.erase(lst.cbegin());
以上文的一些順序容器為基礎,形成的資料結構,主要有棧,佇列和優先順序佇列。
//假設介面卡為s
//返回s中的元素個數
s.size();
//判斷s是否為空
s.empty();
後進先出,預設容器為deque,可選容器為deque,vector和list。
//包含的標頭檔案
#include
//建立乙個能容納int元素的stack
stack
s;//將乙個元素入棧
s.push(1);
//返回棧頂元素
s.top();
//將棧頂元素出棧
s.pop();
先進先出,預設容器為deque,可選容器為deque和list。
//包含標頭檔案
#include
//建立可容納int型元素的queue
queue
q;//使乙個元素入隊
q.push(1);
//使第乙個元素出隊
q.pop();
//返回隊首元素
q.front();
//返回隊尾元素
q.back();
優先順序佇列,預設容器為vector,可選容器為vector和deque。可以想象為乙個最大堆。
//包含的標頭檔案
#include
//建立方法
//type代表容器中元素的型別,con代表底層容器(vector或者deque),func代表元素比較函式
priority_queuepq;
//採用預設構造,容納int元素,以vector為底層容器,operator《為預設元素比較方式
priority_queue pq;
//將乙個元素入隊
pq.push(4);
//將優先順序最大的元素出隊
pq.pop();
//返回優先順序最大的元素
pq.top();
關聯容器有八種,分為兩大類:map和set。它們的共有方法主要是迭代器方法begin(),end()等和size()等。
這裡僅僅介紹下map的常見用法:
//包含標頭檔案
//map和multimap需包含
#include
//unordered_map和unordered_multimap需包含
#include
//建立乙個key為string元素,value為int元素的map
map m;
//向m中新增乙個鍵值對,map的value_type為對應的pair,下列四種方式均可
m.insert(pair("hello", 1));
m.insert(make_pair("hello", 1));
m.emplace("hello", 1);
m["hello"] = 1;
//檢視map中是否有指定的key,若沒有,則返回尾後迭代器
m.find("hello");
//檢視某個key所對應的value
//使用下標,如果沒有key為"world"的鍵值對,則建立("world", 0)鍵值對並新增至這個map
m["world"];
//使用at,若沒有該鍵值對,則報錯
m.at("world");
//最好的訪問方法為,先判斷有沒有該鍵值對,若有,再進行訪問
if (m.find("world") != m.end())
cout
<< m["world"] << endl;
//刪除key為「hello」的鍵值對,不管是否有該鍵值對,都不會報錯
m.erase("hello");
這裡僅展示set的常用方法。
//需包含的標頭檔案
//set和multiset需要包含
#include
//unordered_set和unordered_multiset需要包含
#include
//建立乙個能容納int型元素的set
set s;
//插入乙個元素
s.insert(2);
s.emplace(3);
//找到指定關鍵字位置
s.find(2);
//刪除關鍵字
s.erase(2);
常用容器的方法
1.vector constructors 建構函式 operators 對vector進行賦值或比較 assign 對vector中的元素賦值 at 返回指定位置的元素 back 返回最末乙個元素 begin 返回第乙個元素的迭代器 capacity 返回vector所能容納的元素數量 在不重新分...
c 常用容器API
vector 1.vector建構函式 vector v 採用模板實現類實現,預設建構函式 vector v.begin v.end 將v begin end 區間中的元素拷貝給本身 vector n,elem 建構函式將n個elem拷貝給本身 vector const vector vec 拷貝建...
c 常用容器簡單操作
include include include include include include using namespace std int main intargc,char argv for inti 0 i sizeof a sizeof int i array array int,3 my...