新手向 stl常用容器介紹

2021-08-20 09:24:48 字數 3952 閱讀 5226

1、容器的基本概念

stl庫為許多常用的資料結構提供了通用的模板, 我們叫它容器。顧名思義, 容器可以用來儲存資料, 其中的資料可以是預定義型別, 如int、 double, 也可以是自定義型別。容器類中的元素自動申請記憶體, 不需要new和delete。新增了相應的標頭檔案後容器就可以直接使用了。宣告乙個容器的一般方法如下:

容器型別《元素資料型別(可能有多個, 如map)>容器名稱

例如宣告乙個型別為不定長陣列vector, 元素型別為int, 名稱為v的容器:

vectorv;

為了方便訪問容器中的元素, c++提供了乙個叫做迭代器的物件,迭代器是個所謂的

複雜的指標

,具有遍歷複雜資料結構的能力。其下層執行機制取決於其所遍歷的資料結構。使用的時候像指標一樣用就行了。

宣告乙個迭代器地方法如下:

容器型別《元素資料型別》::iterator 迭代器名稱

大多數容器都提供了begin()和end()方法, 返回指向容器第乙個元素和容器末尾(注意這裡是容器最後乙個元素的下乙個位置, 也就是說.end()所返回的迭代器是沒有指向的元素的。如果解引用它就會出現問題)的迭代器。有了迭代器我們就可以很方便地遍歷乙個容器,

例如遍歷乙個vector

for(vector::iterator it = v.begin(); it != v.begin(); it++)

c++11中提供了更方便的方法

for(auto x : 容器名稱)

其中x是乙個變數, 它的型別和容器中元素相同, 在每次迴圈中會把訪問到的元素的值賦給它。如果是唯讀的操作直接把它當成容器中的元素來用就可以了。如果要修改容器中的元素的話, 對它的操作是不會改變容器中的元素的, 這時候for迴圈中要宣告成auto & x。注意如果要對容器中的元素有增刪就不能使用序列for迴圈, 因為這會使原來的首尾迭代器失效。

1)vector

vector是乙個不定長的陣列, 它過載了運算子,支援隨機訪問。

下面是vector的幾種初始化方法

vectorv;//直接初始化乙個空vector

vectorv2(v)//建立乙個v的副本

vectorv3(n, x)//v3包含了n個值為x的元素

vectorv4 = ; //v4包含了初始值列表中的元素

vector常用的方法有:

begin() 返回首迭代器

end()  返回尾迭代器 

push_back() 在容器尾部新增乙個元素,引數是要新增的元素。

//刪除乙個vector中小於10的數

vectorv = ;

for(auto it = v.begin; it != v.end;)

它的乙個過載是傳入兩個迭代器來刪除這一段的所有元素    

vectorv;

v.erase(v.begin(), v.begin() + 2);//刪除v的前三個元素

size() 返回容器的大小。它由首尾迭代器相減得到,時間複雜度是o(1), 我們可以把它當成乙個常數來用。

clear() 清空容器

比如棧和佇列兩個基本的資料結構, stl庫提供了實現。棧和佇列的概念相必大家都知道, 這裡就不提了。

2)queue(佇列)

queueq; 宣告乙個佇列

q.front();//返回隊首

q.back(); //返回隊尾

q.push(1);//入隊

q.pop();//出隊

q.empty(); //判斷佇列是否為空, 是的話返回true

q.size(); //返回佇列元素個數

3)stack(棧)

stacks; // 申明乙個棧

s.push(1); //將元素入棧

s.pop(); //將棧頂出棧

s.top(); //返回棧頂元素

s.empty();//判斷棧是否為空

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

棧和佇列沒有clear方法, 如果想清空棧或者佇列我們可以這樣做

queueq;

while(!q.empty()) q.pop(); // 一直將隊尾出隊, 直到隊列為空

//或者

queuep;

q = p; //將乙個空佇列賦值給要清空的佇列

//棧的話也一樣

stacks;

while(!s.empty()) s.pop();

stacks2;

s = s2;

4)set(集合)

實現了紅黑樹的平衡二叉檢索樹的資料結構,插入元素時,它會自動調整二叉樹的排列,把元素放到適當的位置,以保證每個子樹根節點鍵值大於左子樹所有節點的鍵值,小於右子樹所有節點的鍵值;另外,還得保證根節點左子樹的高度與右子樹高度相等。

平衡二叉檢索樹使用中序遍歷演算法,檢索效率高於vector和list等容器(log(n)),另外使用中序遍歷可將鍵值按照從小到大遍歷出來。

構造set集合主要目的是為了快速檢索,不可直接去修改鍵值。集合中的元素是不會出現重複的, 如果插入重複的元素, 集合不會發生改變

insert() 插入乙個元素, 由於二叉樹要重新平衡, 複雜度是log(n)

erase() 刪除元素, 複雜度也是log(n)

find() 在容器中查詢某個元素, 如果找到返回指向這個元素的迭代器, 如果沒找到返回尾迭代器。

count() 判斷某個元素是否存在, 若存在返回true

lower_bound() 返回指向大於(或等於)某值的第乙個元素的迭代器

還有一些大多數容器通用的方法, 其用法也和之前提到的類似

clear()

size()

begin()

end()

5)map

map是stl的乙個關聯容器,它提供一對一(其中第乙個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值)的資料 處理能力,由於這個特性,它完成有可能在我們處理一對一資料的時候,在程式設計上提供快速通道。這裡說下map內部資料的組織,map內部自建一顆紅黑樹(一 種非嚴格意義上的平衡二叉樹),這顆樹具有對資料自動排序的功能,所以在map內部所有的資料都是有序的,後邊我們會見識到有序的好處。

map中的元素是pair。 是乙個鍵(key)到值(value)的對映, key和value可以是自定義的任何型別, 不過key需要是過載了小於運算子的型別。value的值是可以改變的而key不能改變。map過載了運算子, 可以通過key來找到value。在通過迭代器來訪問map中的元素時。用->first來訪問key, 通過->second來訪問value。 

定義乙個map時, 必須同時指明健和值的型別。下面是一段統計單詞出現個數的**

mapmp;//申明乙個string到size_t的對映的空容器

string word;

while(cin >> word)

for(auto x : mp)

insert() 插入乙個元素,注意這裡需要插入pair。pair將一對值組合成乙個值, 兩個值擁有不同的資料型別, 兩個值可以用pair的兩個公有函式first和second來訪問。

mapmp;

mp.insert(pair("***", 1));

//這裡在初始化乙個pair的同時給它賦值,建構函式的兩個引數數將分別作為pair的一對值。insert函式將這個pair作為新的元素插入。

erase() 刪除元素, 複雜度也是logn

find() 通過key在容器中查詢某個元素, 如果找到返回指向這個元素的迭代器, 如果沒找到返回尾迭代器。

count() 判斷某個元素是否存在, 若存在返回true

STL容器介紹

fighting進行時 2016.1.12 2016第一彈,明天考試 壓力賊大。廢話不多說了,今天學了stl裡的vector list set map。vector是乙個是個動態的陣列,相比陣列來講,有乙個好處 因為陣列呢,是一段連續的記憶體,如果說你要用10000個吧,但是你最開始只開了100個,...

STL容器介紹

stl的容器可以分為以下幾個大類 一 序列容器,有vector,list,deque,string.二 關聯容器,有set,multiset,map,mulmap,hash set,hash map,hash multiset,hash multimap 三 其他的雜項 stack,queue,va...

stl 向容器中插入元素

描述 構造插入迭代器,可以通過該迭代器對容器插入元素。函式定義 template class container std insert iterator inserter container c,typename container iterator i template class contain...