C STL筆記(1 容器)

2021-09-10 06:34:07 字數 3057 閱讀 8899

c++的stl基本用法。

c++ stl(standard template library,即標準模板庫)中最基本以及最常用的類或容器如下:

stl的最主要的兩個特點:資料結構和演算法的分離,非物件導向本質。訪問物件是通過象指標一樣的迭代器實現的;容器是象鍊錶,向量之類的資料結構,並按模板方式提供;演算法是函式模板,用於操作容器中的資料。由於stl以模板為基礎,所以能用於任何資料型別和結構。

在c語言中,想要表示乙個字串有兩種方法:

陣列和指標,陣列i/o繁瑣,指標對於不熟練的人來說,會出現各式各樣的錯誤,而string可以解決以上兩點問題。

方法一(類似陣列):

for (int i = 0; i < s3.size(); i++)

方法二(迭代器):

for (string::iterator it = str.begin(); it != str.end(); it++)

string s;

s.find( string line );//查詢字串line在當前串中的位置

s.rfind( string line , int pos );//從pos開始從後向前查詢字串line在當前串中的位置

s.erase( int a , int b );//刪除s串從a到b位置的內容

2.vector(include )

vectorv1;

vectorv3;

vector>; //注意空格。這裡相當於二維陣列int a[n][n];

vectorv5 = ; //列表初始化,注意使用的是花括號

vectorv6 = ;

vectorv7(5, -1); //初始化為-1,-1,-1,-1,-1。第乙個引數是數目,第二個引數是要初始化的值

vectorv8(3, "hi");

vectorv9(10); //預設初始化為0

vectorv;

vectorv1;

vectorv2;

v.empty( ); //如果v中不含任何元素,返回真,否則返回假

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

v.push_back(t); 向v的尾端加入乙個值為t的元素

v.pop_back(t); 刪除v的尾端的元素

v[ n ]; //返回v中第n個位置上元素的引用

v1==v2; //當且僅當v1和v2元素數量相同且對應位置的元素值都相同時為真

v.erase( );//刪除乙個或多個元素

v.clear( );//刪除所有元素

注意:只能對已存在的元素進行賦值或者修改操作,如果是要加入新元素,務必使用push_back。push_back的作用有兩個:告訴編譯器為新元素開闢空間、將新元素存入新空間裡。

for (int i = 0; i < v1.size(); i++)      cout << v1[i] << endl;
方法二(迭代器):

正向迭代:

for (vector::iterator iter = v6.begin(); iter != v6.end(); iter++)

cout << *iter << endl;

反向迭代:

for (vector::reverse_iterator iter = v6.rbegin(); iter != v6.rend(); iter++)

cout << *iter << endl;

3.set(include )

set跟vector差不多,它跟vector的唯一區別就是,set裡面的元素是有序的且唯一的,只要你往set裡新增元素,它就會自動排序(按字典序排序),而且,如果你新增的元素set裡面本來就存在,那麼這次新增操作就不執行.

sets1; 

for (set::iterator it = s1.begin(); it != s1.end(); it++)

//執行結果:1 2 3 4 5 6 7 8 9

4.list(include )

list即資料結構裡所學的雙向鍊錶,優點是插入和刪除元素都比較快捷,缺點是不能隨機訪問元素。有了list容器,我們就不用重複造輪子了,直接用即可。

listl1;

listl2;

listl3(10);

listl4(5, 10); //將元素都初始化為10,即此時list為10,10,10,10,10。5

5.map(include )

map運用了雜湊表位址對映的思想,也就是key-value的思想,來實現的。

//1.用insert函式插入pair

mapstudent.insert(pair("r000", "student_zero"));

//2.用"array"方式插入

mapstudent["r123"] = "student_first";

mapstudent["r456"] = "student_second";

mapm1;

if (m1.count("123"))

else

2.迭代器

for (map::iterator it = m1.begin(); it != m1.end(); it++)

//用關鍵字刪除

m1.erase("curry");//如果刪除了會返回1,否則返回0

//迭代器刪除

iter = m1.find("r123"); m1.erase(iter);

//清空map方法一(用迭代器)

m1.erase(m1.begin(), m1.end());

//清空map方法二(用clear函式)

m1.clear();

c STL 1 容器總覽

序列式容器 他們的排列順序和輸入的順序一致,stl中有三個常用序列式容器 vector,deque,list vector 允許隨機訪問,也就是可以直接利用索引進行訪問任何元素,但在頭部和中部進行訪問較為耗時,優勢是在尾部附加元素或者移除元素效率極高,實現如 include include 標頭檔案...

c STL 容器 聯合容器

stl提供了四種聯合容器 set,multiset,map,multimap set and multiset在標頭檔案 map and multimap在標頭檔案 模板函式都一樣的 set map中迭代器不能 或 因為不是連續的序列,是樹。set 在set中,值就是關鍵字,集合中不會有多個相同的關...

C STL學習筆記 1

本文面向的讀者 學習過c 程式語言 也就是說學習過template 但是還沒有接觸過stl的stl的初學者。這實際上是學習stl的一篇筆記。什麼是泛型程式設計 我們可以簡單的理解為 使用模板的程式設計就是泛型程式設計。就像我們我們可以簡單的理解物件導向程式設計就是使用虛函式的程式設計一樣。stl是什...