C 順序容器

2021-07-05 02:36:31 字數 3768 閱讀 6339

1、概述

乙個容器就是一些特定型別物件的集合。

順序容器型別

描述vector

可變大小陣列,支援快速訪問,在尾部之外的地方插入或刪除時可能很慢

deque

雙端佇列。支援快速訪問,在頭尾插入刪除會很快。

list

雙向列表。只支援雙向順序訪問。插入刪除很快

forward_list

單向列表。只支援單向順序訪問,在任何位置插入或刪除都很快

array

固定大小陣列

string

與vector類似,專門用於儲存字元。

1.1、確定使用那種順序容器

通常,使用vector是最好的選擇,除非你有很好的理由選擇其他容器

2、容器庫

一般來說,容器都定義在同名的標頭檔案中。容器均定義為模版類。

沒有預設建構函式的類,在建立容器時,不能只傳遞乙個元素數目引數:

vector

v1(10,init);//正確,提供了元素初始化器

vector

v2(10);//錯誤

容器操作

描述iteratro

迭代器const_iterator

可以讀取元素,但是不能修改元素的迭代器型別

size_type……

… 2.1、迭代器

迭代器範圍

左閉合區間[begin end)

list

::iterator iter; //迭代器型別

2.2、容器定義和初始化

將乙個容器初始化為另乙個容器的拷貝,有兩種方法:

list

authors = ;

vector

char*> articles = ;

list

author1(authors);

deque

author2(authors);//錯誤,容器型別不匹配

vector

author3(authors);//錯誤,容器型別不匹配

forward_lsit words(articles.begin(),articles.end());

列表初始化

list

authors = ;

標準庫array具有固定大小

array

;array

;

array可以進行拷貝

array

arr1 = ;

array

arr2 = arr1; //正確,只要陣列型別匹配即合法(大小需一樣)

使用assign

僅順序容器(array除外)。

用引數所指定的元素(的拷貝)替換左邊容器中的所有元素。

list

names;

vector

char*> oldstyle;

names = oldstyle; //錯誤,容器型別不匹配

names.assign(oldstyle.cbegin().oldstyle.cend());

//assign另乙個版本

list

slist1(1);

slist1.assign(10,"hehe");//10個元素,都是「hehe」

使用swap

交換相同型別容器的內容

vector

svec1(10);

vector

svec1(15);

swap(svec1,svec2);//交換後,svec1為包含15個元素,svec2包含10個元素

容器大小操作

empty,size,max_size

關係運算子

類似於string

如果元素型別不支援運算子操作,則不能進行相應的關係運算。

3、順序容器操作

3.1、新增元素

forward_list,專有的insert和emplace,不支援push_back和 emplace_back

vector,string不支援push_back和 emplace_back

使用push_back

使用push_front

使用emplace操作

新標準引入emplace, emplace_back, empalce_front

呼叫emplace時,將引數傳遞給元素型別的建構函式,直接構造元素。

class a

c.emplace_back("jack",23);//將引數傳給a的建構函式,構造元素

c.push_back("jack",23);//錯誤

c.push_back(a("jack",23));//正確

3.2、訪問元素

c.front();

c.back();

c.at(n);

c[n];

3.3、刪除元素

pop_front, pop_back, erase

3.4、特殊的forward_list操作

insert_after, emplace_after,erase_after

before_begin返回乙個首前(off-the-beginning)迭代器。這個迭代器允許我們在鍊錶受元素之前不存在的元素之後新增或刪除元素。

3.5、改變容器大小

alist.resize(10);

alist.resize(25,-1);

3.6、容器操作可能會使迭代器失效

4、vector物件增長

4.1、管理容量的成員函式

c.shrink_to_fit();//將capacity減小為和size相同大小

c.capacity(); //容器可容納的元素個數

c.reserve(n);//分配至少能容納n個元素的記憶體空間

4.2、capacity和size

size:已經儲存的元素的數量

capacity:最多可儲存的元素數量

5、改變string的其他方法

assign

insert

erase

replace

find

rfind

find_first_of

find_last_of

find_first_ont_of

find_last_not_of

compare

to_string

stoi

stol

stoul

stoll

stoull

stof

stod

stold

6、容器介面卡

6.1、三種介面卡

stack

queue

priority_queue.

容器、迭代器和函式都有介面卡。

本質上,介面卡是一種機制,能使某種事物的行為看起來像另一種事物一樣。

6.2、定義乙個介面卡

介面卡提供兩個建構函式:

stack

stk(deq);//deq是乙個deque容器

C 順序容器

一 順序容器型別 順序容器 vector list deque 介面卡 stack queue priority queue 使用這些容器都必須使用相應的標頭檔案 二 容器元素初始化 cc 建立乙個名為c的空容器 cc c2 建立容器c2的副本 cc b,e 建立c,其元素是迭代器b和e的範圍內的副...

C 順序容器

一 各個順序容器效能差異主要體現在一下兩個方面 1.在容器中任意位置新增和刪除元素的代價 2.隨機訪問容器中元素的代價 vector list deque forward list array string vector是可變大小陣列,支援快速隨機訪問,在尾部插入和刪除元素較為方便 list是雙向鍊...

c 順序容器

1.幾種順序容器的比較 容器本質 特點適用範圍 vector 可變大小陣列 連續儲存,快速隨機訪問,除尾部插入刪除慢 預設使用 deque 雙端佇列 快速隨機訪問,除首尾插入刪除慢 兩端都需要新增刪除元素 list 雙向鍊錶 不支援隨機訪問 只能遍歷 插入刪除迅速,額外記憶體開銷大 需要中間插入元素...