c 容器常用方法

2021-08-18 23:52:18 字數 4699 閱讀 8408

對於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...