生活随笔
收集整理的這篇文章主要介紹了
c++的STL--1概念通述
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
STL的概念
什么是STL?
STL(standard template libaray-標準模板庫):是C++標準庫的重要組成部分,不僅是一個可復用的組件庫,而且 是一個包羅數據結構與算法的軟件框架。
STL從廣義上分為:容器(container),算法(algorithm),迭代器(iterator),容器和算法之間通過迭代器進行無縫連接。STL幾乎所有的代碼都采用了模板類或者模板函數,這相比傳統的由函數和類組成的庫來說提供了更好的代碼重用機會。STL(Standard Template Library)標準模板庫,在我們c++標準庫中隸屬于STL的占到了80%。
STL六大組件簡介
STL提供了六組件,彼此之間可以組合套用,這六大組件分別是:容器,算法,迭代器。仿函數,適配器(配接器),空間配置器。
容器:各種數據結構,如vector,list,deque,set,map等,用來存訪數據,從實現角度來看,STL容器是一種class template算法:各種常用的算法,如sort,find,copy,for_each.從實現的角度看,STL的算法是一種function tempalte迭代器:扮演了容器與算法之間的膠合劑,共有五種類型,從實現角度來看,迭代器是一種operator*,operator->,operator++,operator–等指針相關操作予以重載的class template。所有STL容器都附帶有自己專屬的迭代器,只有容器的設計者才知道如何遍歷自己的元素。原生指針也是一種迭代器。仿函數:行為類似函數,可作為算噠的某種策略。從實現角度來看,仿函數是一種重載了operator()的class或者class template適配器:一種用來修飾容器或者仿函數或迭代器接口的東西空間配置器:負責空間的配置與管理。從實現角度看,配置器是一個實現了動態空間配置,空間管理,空間釋放的class template
STL六大組件的交互關系,容器通過空間配置器取得數據存儲空間,算法通過迭代器存儲容器中得內容,仿函數可以協助算法完成不同的策略的變化,適配器可以修飾仿函數。
STL的優點
STL是c++的一部分,因此不用額外安裝什么,它被內建在你的編譯器之內。STL的一個重要特征是將數據和操作分離。數據由容器類別加以管理,操作則由可定制的算法定義。迭代器在兩者之間充當“粘合劑”,以使算法可以和容器交互運作程序員可以不用思考STL具體的實現過程,只要能夠熟練使用STL就OK了。這樣他們就可以把精力放在程序開放的別的方面STL具有高可重用性,高性能,高移植性,跨平臺的優點
高可重用性 STL中幾乎所有的代碼都采用了模板類和模板函數的方式實現,這相比傳統的由函數和類組成的庫來說提供了更好的代碼重用機會。
高性能:如map可以高效地從十萬條記錄里面查找指定的記錄,因為map是采用紅黑樹的變體實現的
高移植性性:如在項目A上用STL編寫的模塊,可以直接移植到項目B上
三大組件
容器:
常用的數據結構:數組(array),鏈表(list),tree(樹),棧(stac)隊列(queue),集合(set),映射表(map),根據數據在容器中的排列特性,這些數據分為序列式容器和關聯式容器兩種
序列式容器強調值得排序,序列式容器中得每個元素均有固定得位置,除非用刪除或插入得操作改變這個位置。Vector容器,Deque容器,List容器等。關聯式容器是非線性得數結構,更準確得說是二叉樹結構,各元素之間沒有嚴格的物理上得順序關系,也就是說元素在容器中并沒有保存元素置入容器時的邏輯順序,關聯式容器另一個顯著特點是:在值中選擇一個值作為關鍵字key,這個關鍵字對值起到索引的作用,方便查找。Set/multiset容器-Map/mulitimap容器
算法:
廣義而言,我們所編寫的每個程序都是一個算法,其中的每個函數也是一個算法,畢竟它們都是用來解決或大或小的邏輯問題或數學問題。STL收錄的算法經過了數學上的效能分析與證明,是極具復用價值的,包括常用的排序,查找等等。特定的算法往往搭配特定的數據結構,算法與數據結構相輔相成。
3. 算法分為:質變算法和非質變算法
4. 質變算法:是指運算過程中會更改區間內的元素的內容。例如拷貝,替換,刪除等等
5. 非質變算法:是指運算過程中不會更改區間內的元素內容,例如查找,計數,遍歷,尋找極值
再好的編程,也無法讓一個笨拙的算法起死回生。
迭代器
依次尋訪某個容器所含的各個元素
#include<iostream>
#include<string>
using namespace std;
#include<vector>
//使用系統算法的頭文件
#include<algorithm>//容器 vector//迭代器 遍歷功能 用指針理解
//普通的指針也算一種指針
void test01()
{int array[5] = { 1, 3, 5, 7, 8 };int * p = array;//指針指向數組首地址 &array[0]for (int i = 0; i < 5; i++){//cout << array[i] << endl;cout << *(p++) << endl;}}void myPrint(int v)
{cout << v << endl;
}void test02()
{//聲明容器vector<int>v;//聲明一個容器 這個容器中存放int類型數據 對象名稱//向容器中加入數據v.push_back(10);v.push_back(20);v.push_back(30);v.push_back(40);//遍歷容器中的數據//利用迭代器vector<int >::iterator itBegin = v.begin();//itBegin指向是v容器的起始位置vector<int >::iterator itEnd = v.end();//itEnd指向容器中最后一個位置的下一個地址/*while (itBegin!=itEnd){cout << *itBegin << endl;itBegin++;}*///第二種遍歷方式//for (int i = 0; i < 10; i++)/*for (vector<int>::iterator it = v.begin(); it != v.end();it++){cout << *it << endl;}*///第三種方式 利用算法for_each(v.begin(), v.end(), myPrint);}//操作自定義 的數據類型
class Person
{
public:Person(string name,int age){this->m_Name = name;this->m_Age = age;}string m_Name;int m_Age;
};void test03()
{vector<Person >v;Person p1("大頭兒子",10);Person p2("小頭爸爸", 30);Person p3("隔壁王叔叔", 30);Person p4("圍裙媽媽", 28);v.push_back(p1);v.push_back(p2);v.push_back(p3);v.push_back(p4);//遍歷for (vector<Person>::iterator it = v.begin(); it != v.end(); it++){cout << "姓名:" << (*it).m_Name << "年齡:" << it->m_Age << endl;}}//存放自定義數據類型的指針
void test04()
{vector<Person *>v;Person p1("大頭兒子", 10);Person p2("小頭爸爸", 30);Person p3("隔壁王叔叔", 30);Person p4("圍裙媽媽", 28);v.push_back(&p1);v.push_back(&p2);v.push_back(&p3);v.push_back(&p4);for (vector<Person*>::iterator it = v.begin(); it != v.end(); it++){cout << "姓名:" << (*it)->m_Name << "年齡:" << (*it)->m_Age << endl;}
}//容器嵌套容器
void test05()
{vector<vector<int>>v;vector<int>v1;vector<int >v2;vector<int >v3;for (int i = 0; i < 5; i++){v1.push_back(i);v2.push_back(i + 100);v3.push_back(i + 100);}//將小容器放入到大容器中v.push_back(v1);v.push_back(v2);v.push_back(v3);//遍歷所有數據for (vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++){for (vector<int>::iterator vit = (*it).begin(); vit != (*it).end(); vit++){cout << *vit << " ";}cout << endl;}
}int main()
{//test01();//test02();//test03();//test04();test05();system("pause");return 0;
}
總結
以上是生活随笔為你收集整理的c++的STL--1概念通述的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。