1. STL介紹
標準模板庫STL是當今每個從事C++編程的人需要掌握的技術,所有很有必要總結下
本文將介紹STL并探討它的三個主要概念:容器、迭代器、算法。
STL的最大特點就是:
數據結構和算法的分離,非面向對象本質。訪問對象是通過象指針一樣的迭代器實現的;
容器是象鏈表,矢量之類的數據結構,并按模板方式提供;
算法是函數模板,用于操作容器中的數據。由于STL以模板為基礎,所以能用于任何數據類型和結構。
容器可以分為三種主要類型:序列容器、關聯容器、容器適配器。
每種STL容器都具有相關聯的成員函數,這些成員函數的一個子集在所有的STL容器中都定義了。
STL迭代器的屬性和指針類似,程序可以利用迭代器操作STL容器中的元素
STL算法是用于執行常見數據操作的函數,這些操作包括搜索、排序和比較元素,STL提供了大約70種算法,其中大多數算法都使用迭代器來訪問容器元素。
1.1 ? 容器簡介
?容器可以分為三種:序列容器、關聯容器、容器適配器。
序列容器:vector deque list
Vector:可從后端執行快速的插入和刪除,直接訪問任何元素
Deque:從前面或后面執行快速的插入和刪除,直接訪問任何元素
List:雙鏈表,能在任何地方執行快速的插入和刪除
關聯容器:set multiset map multimap
Set:執行快速搜索,元素不允許重復
Multiset:執行快速搜索,元素允許重復
Map:一對一映射,元素不允許重復,快速的基于鍵的搜索
Multimap:一對多映射,元素允許重復,快速的基于鍵的搜索
容器適配器:stack queue priority_queue
Stack:后進先出
Queue:先進先出
priority_queue:優先級最高的元素總是最先出隊
序列容器表示線性數據結構,例如向量和鏈表;
關聯容器是非線性容器,通常能夠快速找出保存在容器中的元素。這類容器能夠保存值的集合或鍵/值對;序列容器和關聯容器統稱為第一類容器。
STL將堆棧和隊列實現為容器適配器,使程序以一種受約束的方式看待序列容器。
STL通常可通過模板實現泛型編程,以避免繼承和虛函數,獲得更好的執行時性能。
1.2 ? 迭代器簡介
迭代器在許多方面和指針相同,用于指向第一類容器的元素。
迭代器提供對一個容器中的對象的訪問方法,并且定義了容器中對象的范圍。迭代器就如同一個指針。事實上,C++的指針也是一種迭代器。但是,迭代器不僅僅是指針,因此你不能認為他們一定具有地址值。例如,一個數組索引,也可以認為是一種迭代器。
迭代器有各種不同的創建方法。程序可能把迭代器作為一個變量創建。一個STL容器類可能為了使用一個特定類型的數據而創建一個迭代器。作為指針,必須能夠使用*操作符類獲取數據。你還可以使用其他數學操作符如++。典型的,++操作符用來遞增迭代器,以訪問容器中的下一個對象。如果迭代器到達了容器中的最后一個元素的后面,則迭代器變成past-the-end值。使用一個past-the-end值得指針來訪問對象是非法的,就好像使用NULL或為初始化的指針一樣。
廢話不多說,直接上demo
//利用istream_iterator進行輸入,利用ostream_iterator進行輸出 ?
//下面程序演示了使用istream_iterator從標準輸入進行輸入,以及使用ostream_iterator輸出到標準輸出 ?
#include "stdafx.h" ?
#include <iostream> ?
using namespace std; ?
??
#include <iterator> ?
??
int _tmain(int argc, _TCHAR* argv[]) ?
{ ?
?cout<<"輸入2個整數:"<<endl; ?
?//下行創建了一個istream_iterator,它能夠以一種類型安全的方式從標準輸入對象cin提取int值 ?
?std::istream_iterator<int> inputInt(cin); ?
??
?//下行對迭代器inputInt解除引用,并從cin中讀出一個整數,然后將它賦予number1 ?
?int number1=*inputInt; ?
?++inputInt; ? ? ? ? ? ? ? ? ? ?//將迭代器inputInt定位到輸出流中的下一個值 ?
?int number2=*inputInt; ? ? ? ? //從inputInt輸入下一個整數,并將它賦予number2 ?
??
?//下行創建了一個ostream_iterator,它能夠在標準輸出對象cout中出入int值 ?
?std::ostream_iterator<int> outputInt(cout); ?
?cout<<"和是:"<<endl; ?
?*outputInt=number1+number2; //將number1和number2的和賦予*outputInt ?
?cout<<endl; ?
?system("pause"); ?
?return 0; ?
} ?
?
?
1.3 ? 算法簡介
STL算法能用于各種容器。STL提供的許多算法,大量用于操作容器,插入、刪除、搜索、排序以及其他算法,都適合于部分或者所有的STL容器。
STL的實現非常簡單。到目前為止,類的設計者都將算法作為容器的成員函數,使算法和容器相關聯。STL采用不同的方法,STL的算法和容器是分離的,它只是間接地通過迭代器操作容器的元素。
STL算法能夠用于STL容器以及基于指針的、C風格的數組
標準模板庫STL是當今每個從事C++編程的人需要掌握的技術,所有很有必要總結下
本文將介紹STL并探討它的三個主要概念:容器、迭代器、算法。
STL的最大特點就是:
數據結構和算法的分離,非面向對象本質。訪問對象是通過象指針一樣的迭代器實現的;
容器是象鏈表,矢量之類的數據結構,并按模板方式提供;
算法是函數模板,用于操作容器中的數據。由于STL以模板為基礎,所以能用于任何數據類型和結構。
容器可以分為三種主要類型:序列容器、關聯容器、容器適配器。
每種STL容器都具有相關聯的成員函數,這些成員函數的一個子集在所有的STL容器中都定義了。
STL迭代器的屬性和指針類似,程序可以利用迭代器操作STL容器中的元素
STL算法是用于執行常見數據操作的函數,這些操作包括搜索、排序和比較元素,STL提供了大約70種算法,其中大多數算法都使用迭代器來訪問容器元素。
1.1 ? 容器簡介
?容器可以分為三種:序列容器、關聯容器、容器適配器。
序列容器:vector deque list
Vector:可從后端執行快速的插入和刪除,直接訪問任何元素
Deque:從前面或后面執行快速的插入和刪除,直接訪問任何元素
List:雙鏈表,能在任何地方執行快速的插入和刪除
關聯容器:set multiset map multimap
Set:執行快速搜索,元素不允許重復
Multiset:執行快速搜索,元素允許重復
Map:一對一映射,元素不允許重復,快速的基于鍵的搜索
Multimap:一對多映射,元素允許重復,快速的基于鍵的搜索
容器適配器:stack queue priority_queue
Stack:后進先出
Queue:先進先出
priority_queue:優先級最高的元素總是最先出隊
序列容器表示線性數據結構,例如向量和鏈表;
關聯容器是非線性容器,通常能夠快速找出保存在容器中的元素。這類容器能夠保存值的集合或鍵/值對;序列容器和關聯容器統稱為第一類容器。
STL將堆棧和隊列實現為容器適配器,使程序以一種受約束的方式看待序列容器。
STL通常可通過模板實現泛型編程,以避免繼承和虛函數,獲得更好的執行時性能。
1.2 ? 迭代器簡介
迭代器在許多方面和指針相同,用于指向第一類容器的元素。
迭代器提供對一個容器中的對象的訪問方法,并且定義了容器中對象的范圍。迭代器就如同一個指針。事實上,C++的指針也是一種迭代器。但是,迭代器不僅僅是指針,因此你不能認為他們一定具有地址值。例如,一個數組索引,也可以認為是一種迭代器。
迭代器有各種不同的創建方法。程序可能把迭代器作為一個變量創建。一個STL容器類可能為了使用一個特定類型的數據而創建一個迭代器。作為指針,必須能夠使用*操作符類獲取數據。你還可以使用其他數學操作符如++。典型的,++操作符用來遞增迭代器,以訪問容器中的下一個對象。如果迭代器到達了容器中的最后一個元素的后面,則迭代器變成past-the-end值。使用一個past-the-end值得指針來訪問對象是非法的,就好像使用NULL或為初始化的指針一樣。
廢話不多說,直接上demo
//利用istream_iterator進行輸入,利用ostream_iterator進行輸出 ?
//下面程序演示了使用istream_iterator從標準輸入進行輸入,以及使用ostream_iterator輸出到標準輸出 ?
#include "stdafx.h" ?
#include <iostream> ?
using namespace std; ?
??
#include <iterator> ?
??
int _tmain(int argc, _TCHAR* argv[]) ?
{ ?
?cout<<"輸入2個整數:"<<endl; ?
?//下行創建了一個istream_iterator,它能夠以一種類型安全的方式從標準輸入對象cin提取int值 ?
?std::istream_iterator<int> inputInt(cin); ?
??
?//下行對迭代器inputInt解除引用,并從cin中讀出一個整數,然后將它賦予number1 ?
?int number1=*inputInt; ?
?++inputInt; ? ? ? ? ? ? ? ? ? ?//將迭代器inputInt定位到輸出流中的下一個值 ?
?int number2=*inputInt; ? ? ? ? //從inputInt輸入下一個整數,并將它賦予number2 ?
??
?//下行創建了一個ostream_iterator,它能夠在標準輸出對象cout中出入int值 ?
?std::ostream_iterator<int> outputInt(cout); ?
?cout<<"和是:"<<endl; ?
?*outputInt=number1+number2; //將number1和number2的和賦予*outputInt ?
?cout<<endl; ?
?system("pause"); ?
?return 0; ?
} ?
?
?
1.3 ? 算法簡介
STL算法能用于各種容器。STL提供的許多算法,大量用于操作容器,插入、刪除、搜索、排序以及其他算法,都適合于部分或者所有的STL容器。
STL的實現非常簡單。到目前為止,類的設計者都將算法作為容器的成員函數,使算法和容器相關聯。STL采用不同的方法,STL的算法和容器是分離的,它只是間接地通過迭代器操作容器的元素。
STL算法能夠用于STL容器以及基于指針的、C風格的數組