1、容器的基本概念
stl庫為許多常用的資料結構提供了通用的模板, 我們叫它容器。顧名思義, 容器可以用來儲存資料, 其中的資料可以是預定義型別, 如int、 double, 也可以是自定義型別。容器類中的元素自動申請記憶體, 不需要new和delete。新增了相應的標頭檔案後容器就可以直接使用了。宣告乙個容器的一般方法如下:
容器型別《元素資料型別(可能有多個, 如map)>容器名稱
例如宣告乙個型別為不定長陣列vector, 元素型別為int, 名稱為v的容器:
vectorv;
為了方便訪問容器中的元素, c++提供了乙個叫做迭代器的物件,迭代器是個所謂的
複雜的指標
,具有遍歷複雜資料結構的能力。其下層執行機制取決於其所遍歷的資料結構。使用的時候像指標一樣用就行了。
宣告乙個迭代器地方法如下:
容器型別《元素資料型別》::iterator 迭代器名稱
大多數容器都提供了begin()和end()方法, 返回指向容器第乙個元素和容器末尾(注意這裡是容器最後乙個元素的下乙個位置, 也就是說.end()所返回的迭代器是沒有指向的元素的。如果解引用它就會出現問題)的迭代器。有了迭代器我們就可以很方便地遍歷乙個容器,
例如遍歷乙個vector
c++11中提供了更方便的方法for(vector::iterator it = v.begin(); it != v.begin(); it++)
其中x是乙個變數, 它的型別和容器中元素相同, 在每次迴圈中會把訪問到的元素的值賦給它。如果是唯讀的操作直接把它當成容器中的元素來用就可以了。如果要修改容器中的元素的話, 對它的操作是不會改變容器中的元素的, 這時候for迴圈中要宣告成auto & x。注意如果要對容器中的元素有增刪就不能使用序列for迴圈, 因為這會使原來的首尾迭代器失效。for(auto x : 容器名稱)
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(佇列)
3)stack(棧)queueq; 宣告乙個佇列
q.front();//返回隊首
q.back(); //返回隊尾
q.push(1);//入隊
q.pop();//出隊
q.empty(); //判斷佇列是否為空, 是的話返回true
q.size(); //返回佇列元素個數
棧和佇列沒有clear方法, 如果想清空棧或者佇列我們可以這樣做stacks; // 申明乙個棧
s.push(1); //將元素入棧
s.pop(); //將棧頂出棧
s.top(); //返回棧頂元素
s.empty();//判斷棧是否為空
s.size();//返回棧中元素個數
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來訪問。
erase() 刪除元素, 複雜度也是lognmapmp;
mp.insert(pair("***", 1));
//這裡在初始化乙個pair的同時給它賦值,建構函式的兩個引數數將分別作為pair的一對值。insert函式將這個pair作為新的元素插入。
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...