(最近學了個c++標準模板庫,名字叫做stl,個人感覺比較實用,但也是不太好理解。其他滿分,真的型別全,範圍廣,最最重要的一點是極為方便。)
一 什麼是stl
(1)stl是c++標準程式庫的核心,深刻影響了標準程式庫的整體結構,它由一些可適應不同需求的集合類,以及在這些資料集合上操作的演算法構成,stl內的所有元件都由模板構成,其元素可以是任意型別。stl是所有c++編譯器和所有作業系統平台都支援的一種庫。這是不是就可以看出stl有多方便。
(2)stl主要有以下幾部分構成容器(container) (管理某類物件的集合),迭代器(iterator) (在物件集合上進行遍歷),演算法(algorithm) ( 處理集合內的元素),容器介面卡(container adaptor),函式物件(functor)
(3)stl容器主要分為兩種
序列式容器-排列次序取決於插入時機和位置
關聯式容器-排列順序取決於特定準則
(4)stl容器的共同能力
所有容器中存放的都是值而非引用。如果希望存放的不是副本,容器元素只能是指標。
所有元素都形成乙個次序(order),可以按相同的次序一次或多次遍歷每個元素
(5)stl容器元素的條件
必須能夠通過拷貝建構函式進行複製,必須可以通過賦值運算子完成賦值操作,必須可以通過析構函式完稱銷毀動作,序列式容器元素的預設建構函式必須可用,某些動作必須定義operator ==,例如搜尋操作;關聯式容器必須定義出排序準則,預設情況是過載operator <
二 操作
共同操作
1.初始化,產生乙個空容器,以另乙個容器元素為初值完成初始化
std::listl; …
std::vectorc(l.begin(),l.end());
2.以陣列元素為初值完成初始化
int array=; …
std::setc(array,array+sizeof(array)/sizeof(array[0]));
(1)與大小有關的操作
size()-返回當前容器的元素數量;empty()-判斷容器是否為空;max_size()-返回容器能容納的最大元素數量
比較(comparison)==,!=,<,<=,>,>=比較操作兩端的容器必須屬於同一型別,如果兩個容器內的所有元素按序相等,那麼這兩個容器相等;採用字典式順序判斷某個容器是否小於另乙個容器
(2)賦值和交換
swap用於提高賦值操作效率,與迭代器(iterator)相關的操作,例子很多就列舉以下幾個
begin()-返回乙個迭代器,指向第乙個元素,
end()-返回乙個迭代器,指向最後乙個元素之後,
rbegin()-返回乙個逆向迭代器,指向逆向遍歷的第乙個元素。
rend()-返回乙個逆向迭代器,指向逆向遍歷的最後乙個元素之後
(3)元素操作
例如以下三個,就是關於元素操作
insert(pos,e)-將元素e的拷貝安插於迭代器pos所指的位置
erase(beg,end)-移除[beg,end]區間內的所有元素
clear()-移除所有元素
三 迭代器
迭代器是乙個經常聽到的名詞,而stl中的迭代器是什麼呢,本人只知道其可遍歷stl容器內全部或部分元素的物件
指出容器中的乙個特定位置。
(1)雙向迭代器
可以雙向行進,以遞增運算前進或以遞減運算後退、可以用==和!=比較。
list、set和map提供雙向迭代器
(2)隨機訪問迭代器
除了具備雙向迭代器的所有屬性,還具備隨機訪問能力。可以對迭代器增加或減少乙個偏移量、處理迭代器之間的距離或者使用《和》之類的關係運算子比較兩個迭代器。vector、deque和string提供隨機訪問迭代器
三 具體有啥
(一)vector
vector模擬動態陣列
vector的元素可以是任意型別t,但必須具備賦值和拷貝能力(具有public拷貝建構函式和過載的賦值操作符)
必須包含的標頭檔案#include ,vector支援隨機訪問其大小(size)和容量(capacity);size返回返回實際元素個數,capacity返回vector能容納的元素最大數量。如果插入元素時,元素個數超過capacity,需要重新配置內部儲存器。
1.移除(remove)元素
c.pop_ back) 移除最後乙個元素但不返回最後乙個元素
c.erase(pos) 刪除pos位置的元素,返回下乙個元素的位置
c.erase(beg,end) 刪除區間[beg,end]內所有元素,返回下乙個元素的位置
c.clear() 移除所有元素,清空容器
c.resize(num) 將元素數量改為num (增加的元素用de****t建構函式產生,多餘的元素被刪除)
c.resize(num,e) 將元素數量改為num (增加的元素是e的副本)
vector 引用示例
(二)map/multimap
它使用平衡二叉樹管理元素,元素包含兩部分(key,value),key和value可以是任意型別;必須包含的標頭檔案#include 。根據元素的key自動對元素排序,因此根據元素的key進行定位很快,但根據元素的value定位很慢,且不能直接改變元素的key,可以通過operator 直接訪問元素值,map中不允許key相同的元素,multimap允許key相同的元素
(1)構造、拷貝和析構
map c 產生空的map
map c1(c2) 產生同型別的c1,並複製c2的所有元素
map c(op) 以op為排序準則產生乙個空的map
map c(beg,end) 以區間[beg,end]內的元素產生乙個map
map c(beg,end,op) 以op為排序準則,以區間[beg,end]內的元素產生乙個map
~ map() 銷毀所有元素並釋放記憶體。
(2)非變動性操作
c.size() 返回元素個數
c.empty() 判斷容器是否為空
c.max size() 返回元素最大可能數量
c1==c2 判斷c1是否等於c2
c1!=c2 判斷c1是否不等於c2
c1c2 判斷c1是否大於c2
c1<=c2 判斷c1是否大於等於c2
c1>=c2 判斷c1是否小於等於c2
(3)特殊搜尋操作
count(key) 返回"鍵值等於key"的元素個數
find(key) 返回"鍵值等於key」的第乙個元素,找不到返回
lower. bound(key) 返回」鍵值大於等於key」的第乙個元素
upper_ bound(key) 返回」鍵值大於key'的第乙個元素
equal_ range(key) 返回"鍵值等於key"的元素區間
(4)迭代器相關函式
begin() 返回乙個雙向迭代器,指向第乙個元素
end() 返回乙個雙向迭代器,指向最後-乙個元素之後
rbegin() 返回乙個逆向迭代器,指向逆向遍歷的第一- -個元素
rend() 返回乙個逆向迭代器,指向逆向遍歷的最後乙個元素
(5)安插(insert) 元素
c.insert(pos,e) 在pos位置為起點插入e的副本,並返回新元素位置(插入速度取決於pos)
c.insert(e) 插入e的副本,並返回新元素位置
c.insert(beg,end) 將區間[beg,end]內所有元素的副本插入到c中
(6)移除(remove) 元素
c.erase(pos) 刪除迭代器pos所指位置的元素,無返回值
c.erase(val) 移除所有值為val的元素,返回移除元素個數
c.erase(beg,end) 刪除區間[beg,end]內所有元素,無返回值
c.clear() 移除所有元素,清空容器
二、**演示
#include #include #include using namespace std;
int main()
cout << "size: " << a.size() << endl;
a.pop_back();
a[0] = 1;
cout << "size: " << a.size() << endl;
for (int i = 0; i < (int)a.size(); ++i)
cout << endl;
sort(a.begin(), a.end());
cout << "size: " << a.size() << endl;
for (int i = 0; i < (int)a.size(); ++i)
cout << endl;
a.clear();
cout << "size: " << a.size() << endl;
return 0;
}
下面是見證奇蹟的時刻
好用且方便,值得擁有
三、心得體會
stl作為c++的工具,確實會給使用者帶來極大的方便,但方便的同時,有權衡好如何使用它,乙個不留神可能就會導致錯誤連篇,要熟練掌握,還是有一段路要走的。
STL重要知識總結
stl的知識學完了,明天的演算法課就要講貪心演算法了。在這一段stl學習中,我逐漸掌握了stl模板的使用,的確很方便,也很讓人依賴。題目需要思考,知識需要理解。vj上的題目沒做幾道,多數是用sort,vector,set做的,很多不會的題目。我總結這個不會有兩個因素 閱讀英語材料不是很適應和解題和 ...
STL不熟知識點總結
在前面已經總結了stl基本知識點的應用,本篇部落格我將主要總結一下自己對stl這一方面不熟的知識點。一.用迭代器遍歷map中的元素 訪問標準容器的元素的通用方法是使用迭代器 for map iterator it b.begin it b.end it 2.it first 表示用迭代器指向map中...
STL相關知識
c 的標準模板庫 standard template library,簡稱stl 是乙個容器和演算法的類庫。容器往往包含同一型別的資料。stl中比較常用的容器是vector,set和map等。vectore 乙個vector類似於乙個動態的一維陣列,vector中可以存在重複的元素!1 宣告 1 v...