C STL 迭代器 容器 演算法

2021-08-19 21:54:27 字數 4526 閱讀 5648

stl(standardtemplatelibrary),即標準模板庫,是乙個具有工業強度的,高效的c++程式庫。它被容納於c++標準程式庫(c++standardlibrary)中。

該庫包含了諸多在電腦科學領域裡所常用的基本資料結構和基本演算法。為廣大c++程式設計師們提供了乙個可擴充套件的應用框架,高度體現了軟體的可復用性。

為了具有足夠通用性,stl主要依賴於模板而不是封裝,繼承和虛函式(多型性)——oop(object-oriented programming)的三個要素。

stl中六大元件:

1)容器(container),是一種資料結構,如list,vector,和deques ,以模板類的方法提供。為了訪問容器中的資料,可以使用由容器類輸出的迭代器;

3)演算法(algorithm),是用來操作容器中任何資料結構的資料的模板函式。例如,stl用sort()來對乙個vector中的資料進行排序,用find()來搜尋乙個list中的物件,函式本身與他們操作的資料的結構和型別無關,因此他們可以在從簡單陣列到高度複雜容器的任何資料結構上使用;

4)仿函式(function object)

5)迭代介面卡(adaptor)

6)空間配製器(allocator)

stl中的容器有佇列容器和關聯容器,容器介面卡(congtainer adapters:stack,queue,priority queue),位集(bit_set),串包(string_package)等等。

2)關聯式容器(associated containers),元素位置取決於特定的排序準則,和插入順序無關,set、multiset、map、multimap

//1.定義和初始化

vector

vec1; //預設初始化,vec1為空

vector

vec2(vec1); //使用vec1初始化vec2

vector

vec3(vec1.begin(),vec1.end());//使用vec1初始化vec2

vector

vec4(10); //10個值為的元素

vector

vec5(10,4); //10個值為的元素

//2.常用操作方法

vec1.push_back(100); //新增元素

int size = vec1.size(); //元素個數

bool isempty = vec1.empty(); //判斷是否為空

cout

<0]vec1.insert(vec1.end(),5,3); //從vec1.back位置插入個值為的元素

vec1.pop_back(); //刪除末尾元素

vec1.erase(vec1.begin(),vec1.end());//刪除之間的元素,其他元素前移

cout

<<(vec1==vec2)?true:false; //判斷是否相等==、!=、>=、<=...

vector

::iterator iter = vec1.begin(); //獲取迭代器首位址

vec1.clear(); //清空元素

//3.遍歷

//下標法

int length = vec1.size();

for(int i=0;icout

vector

::const_iterator iterator = vec1.begin();

for(;iterator != vec1.end();iterator++)

迭代器是連線容器演算法的一種重要橋梁。就是一種智慧型指標。它對原始指標進行了封裝,而且提供一些等價於原始指標的操作,做到既方便又安全。

容器的迭代器都是定身製作的,什麼意思呢?全部容器都內建乙個迭代器。該內建迭代器由容器的設計者實現。

常見的一些迭代器型別:iterator、const_iterator、reverse_iterator和const_reverse_iterator

iterator:

迭代器iterator 提供了一種一般化的方法對順序或關聯容器型別中的每個元素進行連續訪問

例如,假設iter為任意容器型別的乙個iterator,

++iter表示向前移動迭代器使其指向容器的下乙個元素,

*iter返回iterator 指向元素的值,

每種容器型別都提供乙個begin()和乙個end()成員函式。

begin()返回乙個iterator 它指向容器的第乙個元素

end()返回乙個iterator 它指向容器的末元素的下乙個位置

#include 

#include

using

namespace

std;

int main()

cout

<< endl;

//在第乙個元素之前插入111 insert begin+n是在第n個元素之前插入

v.insert(v.begin(),111);

//在最後乙個元素之後插入222 insert end + n 是在n個元素之後插入

v.insert(v.end(),222);

for(vector

::iterator i = v.begin();i!= v.end();++i)

cout

<< endl;

vector

arr(10);

for(int i = 0; i < 10; i++)

for(vector

::iterator i = arr.begin();i!= arr.end();++i)

cout

<< endl;

//刪除 同insert

arr.erase(arr.begin());

for(vector

::iterator i = arr.begin();i!= arr.end();++i)

cout

<< endl ;

arr.erase(arr.begin(),arr.begin()+5);

for(vector

::iterator i = arr.begin();i!= arr.end();++i)

cout

<< endl ;

return

0 ;

}

#include

#include

#include

using

namespace

std;

int main()

for(vector

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

cout

<< endl;

reverse(v.begin(),v.end()); //倒序函式

for(vector

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

cout

<< endl;

return

0;

stl中演算法大致分為四類:

#include

#include//用到find函式

#include

using

namespace

std;

int main()

if(vec.end()!=find(vec.begin(),vec.end(),7))

上述**中。值得注意的是用到的find函式,find函式的函式原型為:template

#include

using

namespace

std;

class a{};

class a1:public a{};//類a1繼承a

class b{};

void print(a)//僅僅需指定引數型別

從上面的**能夠看出,在main函式中,我們呼叫print(a1())。即能夠用派生類物件作為實參傳遞給以基類型別作為形參的函式。所以find函式中的vec.begin()作為實參,以輸入迭代器型別作為形參,兩者能夠達到虛實相結合的目的而不會出錯。所以說。迭代器為各類演算法和和各類容器提供了乙個相互溝通的平台。

C STL容器迭代器失效 筆記

迭代器是封裝了指標 過載了 等操作符的類模板,具有類似指標的行為。迭代器的設計是對資料結構的泛化,使不同容器具有相同的訪問方式,讓 不必依賴於特定的資料結構。指標也可以狹義的理解為迭代器。在c 中經常使用迭代器對stl容器進行操作,但很多同學沒怎麼關注過迭代器失效的問題。迭代器失效,指迭代器指向錯誤...

c 容器演算法迭代器初識 容器演算法迭代器

c 容器演算法迭代器初識 容器演算法迭代器 stl中最常用的為迭代器vector,可以理解為陣列,下面我們將學習如何向這個容器 中插入資料 並遍歷這個容器 容器 vector 演算法 for each 迭代器 vector iteator include include include using ...

C STL迭代器 插入迭代器

include stdafx.h include include include include include 演算法庫對所有在容器上的操作有個承諾 決不修改容器的大小 不插入 不刪除 有了插入迭代器,既使得演算法庫可以通過迭代器對容器插入新的元素,又不違反這一承諾,即保持了設計上的一致性。usi...