程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> STL標准模板庫(簡介)

STL標准模板庫(簡介)

編輯:C++入門知識

標准模板庫(STL,Standard Template Library)是C++標准庫的重要組成部分,包含了諸多在計算機科學領域裡所常見的基本數據結構和基本算法,為廣大C++程序員提供了一個可擴展的應用框架,高度體現了軟件的可復用性。

1.STL簡介

STL最初由惠普實驗室開發,並於1998年被定義為國際標准,正式成為C++語言的標准庫。在STL中采用了泛型編程的方法,泛型編程是通過模板來實現算法源代碼,並將其用於不同數據類型的軟件重用方法。從根本上說,STL是一些容器、算法和其他一些組件的集合,這些容器有list,vector,set,map等。STL已經是標准化組件,在使用時不需要重新開發,直接使用現有的組件。因此,使用STL編寫程序會更加容易和高效。

在C++標准中,STL被組織成下面的13個頭文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。通常STL中最重要的是算法和容器,而迭代器將二者統一起來,每個容器都有自己的迭代器,算法通過迭代器來定位和操縱容器中的元素。

C++標准庫提供了眾多的類和函數,可以完成更多的功能,當我們編寫程序時,我們定義的類名和函數名可能和標准庫中的某個名稱相同。為了避免這種情況所造成的名稱沖突,C++標准庫中的一切類和函數都放在命名空間std中。

a、新的C++頭文件如<iostream>包含的基本功能和對應的舊文件(<iostream.h>)相同,但頭文件的內容包含在std命名空間中;
b、具有C庫功能的新C++頭文件具有如<cstdio>這樣的名字,它們提供的內容和相應的C頭文件相同,只是內容在std中。

標准STL序列容器:vector、string、deque和list。
標准STL關聯容器:set、multiset、map和multimap。

更多的STL知識,可見《EFFECTIVE STL中文版:50條有效使用STL的經驗 》,這裡簡單介紹string、vector、list和map四種。

2.string類型

與其他標准庫類型一樣,如果用戶要使用string類型,必須包含相關頭文件:

#include<>
 std::;

a、string對象的初始化

>> s3( s4(s3,);
 s5(s3.begin(),s3.begin()+);
 s6(s3,,);
 s7(,);
b、string對象的輸入輸出

string對象的輸入輸出與基本類型的輸入輸出類似,可直接使用cout、cin以及<<、>>運算符。

c、string類的基本操作

s1=s2;
s1.empty();
s1.size();
s1[n];
s+=s2;s1=s1+s2;
s1.insert(pos,s2);
s1.insert(pos,cp,len);
s1.c_str();
s1.substr(pos,n);
s1.append(s2);
s1.append(cp);
s1.replace(pos,len,s2);
s1.find(s2,pos);
s1.rfind(s2,pos);
s1.find_first_of(s2,pos);
s1.find_last_of(s2,pos);

3.vector類型

注意:vector是一個類模板,而非數據類型

a、vector對象的初始化

vector<><> ivec1(ivec);
vector<> ivec2(n,i);
vector<> ivec3(n);

b、vector類常用的接口

reserve(size_type n);
size_type capacity() ;
iterator begin();
iterator end();
reverse_iterator rbegin();
reverse_iterator rend();

 resize(size_type n, T x=T());
size_type size();
 empty() ;
reference at(size_type pos);
reference [](size_type pos);
reference front()
reference back();

 push_back( T &x);
 pop_back();

 assign(const_iterator front, const_iterator last);
 assign(size_type n,  T&x=T());
 T& x=T());
 insert(iterator it, size_type n,  T& x);
 insert(iterator it, const_iterator front, const_iterator last);

iterator erase(iterator front, iterator last);
 clear();
 swap(vector x);

c、迭代器

定義迭代器vector<T>::iterator it;迭代器類似於指針,可以使用*it來訪問相應元素,容器的begin()和end()函數都是常用接口,在程序設計時注意靈活使用。

為了減少向量每次都需要申請和釋放空間操作,vector容器每次在申請內存時,都會額外申請一塊連續的存儲區,用於存放新加入的元素,從而不必每次都為新元素重新分配一次容器。vector容器的存儲狀態如圖:

b、數據的插入有三種方法

用insert函數插入pair數據,pair是<utility>頭文件中定義的struct,在STL中凡是“必須傳回兩個值”的函數,都會用到pair

mapStudent.insert(pair<,  *>(,));

用insert插入value_type數據

mapStudent.insert(map<,  *>::value_type(,));

使用數組方式插入數據

mapStudent[] = ;

如何判斷插入成功與否問題

<,  *><map<,  *>::iterator, >= mapStudent.insert(pair<,  *>(, (Insert_Pair.second == <<<<<<<<

c、map的大小:mapStudent.size();

遍歷:

(map<,  *>::iterator iter = mapStudent.begin();iter!=mapStudent.end();iter++<<iter->first<< <<iter->second<<endl;}

數據的查找:count計數關鍵字出現的次數,返回只能是0(沒出現)或1(出現);使用find

map<, *>::iterator iter = mapStudent.find((iter !=<<<<<<<<endl;}

數據的清空與判空:clear()和empty()

d、數據的刪除,erase有三個重載函數

map<,  *>= mapStudent.find( n = mapStudent.erase();
mapStudent.erase(mapStudent.begin(), mapStudent.end());

5.list鏈表

list將元素按順序儲存在鏈表中。 與vector相比,它允許快速的插入和刪除,但是隨機訪問卻比較慢。list對象函數

assign() ;
begin() ;
end() ;
clear();
empty() ;
erase() ;
front() ;
back() ;
get_allocator() ;
insert() ;
max_size() ;
merge() ;
splice() ;
pop_back();
pop_front() ;
push_back() ;
push_front() ;
rbegin() ;
rend() ;
remove() ;
remove_if() ;
resize() ;
reverse() ;
size() ;
sort();
swap();
unique();
STL的各個容器之間的操作有很多近似之處,先介紹到這裡。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved