Android NDK開發之旅26 C++ STL

###1.1 什麼是STL? html

STL(Standard Template Library),即標準模板庫,是一個具備工業強度的,高效的C++程序庫。它被容納於C++標準程序庫(C++ Standard Library)中,是ANSI/ISO C++標準中最新的也是極具革命性的一部分。該庫包含了諸多在計算機科學領域裏所經常使用的基本數據結構和基本算法。爲廣大C++程序員們提供了一個可擴展的應用框架,高度體現了軟件的可複用性。 STL的一個重要特色是數據結構和算法的分離。儘管這是個簡單的概念,但這種分離確實使得STL變得很是通用。例如,因爲STL的sort()函數是徹底通用的,你能夠用它來操做幾乎任何數據集合,包括鏈表,容器和數組; STL另外一個重要特性是它不是面向對象的。爲了具備足夠通用性,STL主要依賴於模板而不是封裝,繼承和虛函數(多態性)——OOP的三個要素。你在STL中找不到任何明顯的類繼承關係。這好像是一種倒退,但這正好是使得STL的組件具備普遍通用性的底層特徵。另外,因爲STL是基於模板,內聯函數的使用使得生成的代碼短小高效; 從邏輯層次來看,在STL中體現了泛型化程序設計的思想,引入了諸多新的名詞,好比像需求(requirements)概念(concept)模型(model)容器(container)算法(algorithmn)迭代子(iterator)等。與OOP(object-oriented programming)*中的多態(polymorphism)**同樣,泛型也是一種軟件的複用技術;從實現層次看,整個STL是以一種類型參數化的方式實現的,這種方式基於一個在早先C++標準中沒有出現的語言特性--模板(template)ios

###1.2 STL內容介紹程序員

組件 描述
容器(Containers) 容器是用來管理某一類對象的集合。C++ 提供了各類不一樣類型的容器,
好比 deque、list、vector、map 等。
算法(Algorithms) 算法做用於容器。它們提供了執行各類操做的方式,包括對容器內容執行初始化、
排序、搜索和轉換等操做。
迭代器(iterators) 迭代器用於遍歷對象集合的元素。這些集合多是容器,也多是容器的子集。

####1.2.1 容器算法

STL中的容器有隊列容器和關聯容器,容器適配器(congtainer adapters:stack,queue,priority queue),位集(bit_set),串包(string_package)等等。 (1)序列式容器(Sequence containers),每一個元素都有固定位置--取決於插入時機和地點,和元素值無關,vector、deque、list;數組

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

容器類自動申請和釋放內存,無需new和delete操做。vector基於模板實現,需包含頭文件vector。 ######示例以下:數據結構

#include <iostream>
#include <vector>
using namespace std;
void main() {

	//1.定義和初始化  
	vector<int> vec1;    //默認初始化,vec1爲空  
	vector<int> vec2(vec1);  //使用vec1初始化vec2  
	vector<int> vec3(vec1.begin(), vec1.end());//使用vec1初始化vec2  
	vector<int> vec4(10);    //10個值爲的元素  
	vector<int> vec5(10, 4);  //10個值爲的元素  

	//2.經常使用操做方法  
	vec1.push_back(100);            //添加元素  
	int size = vec1.size();         //元素個數  
	bool isEmpty = vec1.empty();    //判斷是否爲空  
	cout << vec1[0] << endl;        //取得第一個元素  
	vec1.insert(vec1.end(), 5, 3);    //從vec1.back位置插入個值爲的元素  
	vec1.pop_back();              //刪除末尾元素  
	vec1.erase(vec1.begin(), vec1.end());//刪除之間的元素,其餘元素前移  
	cout << (vec1 == vec2) ? true : false;  //判斷是否相等==、!=、>=、<=...  
	vector<int>::iterator iter = vec1.begin();    //獲取迭代器首地址  
	vec1.clear();                 //清空元素  

	//3.遍歷  
	//下標法  
	int length = vec1.size();
	for (int i = 0; i < length; i++)
	{
		cout << vec1[i];
	}
	cout << endl << endl;
	//迭代器法  
	vector<int>::const_iterator iterator = vec1.begin();
	for (; iterator != vec1.end(); iterator++)
	{
		cout << *iterator;
	}
	system("pause");
}

結果輸出:
100
1
複製代碼

####1.2.2 迭代器框架

Iterator(迭代器)模式又稱Cursor(遊標)模式,用於提供一種方法順序訪問一個聚合對象中各個元素, 而又不需暴露該對象的內部表示。或者這樣說可能更容易理解:Iterator模式是運用於聚合對象的一種模式,經過運用該模式,使得咱們能夠在不知道對象內部表示的狀況下,按照必定順序(由iterator提供的方法)訪問聚合對象中的各個元素。 迭代器的做用:可以讓迭代器與算法不干擾的相互發展,最後又能無間隙的粘合起來,重載了*,++,==,!=,=運算符。用以操做複雜的數據結構,容器提供迭代器,算法使用迭代器;常見的一些迭代器類型:iterator、const_iterator、reverse_iterator和const_reverse_iterator。數據結構和算法

######示例以下:函數

#include <iostream> 
#include <vector> 
using namespace std;
int main()
{
	vector<int> v;
	v.push_back(3);  //數組尾部插入3  
	v.push_back(2);
	v.push_back(1);
	v.push_back(0);
	cout << " 下標 " << v[3] << endl;
	cout << " 迭代器 " << endl;
	for (vector<int>::iterator i = v.begin(); i != v.end(); ++i)
	{
		cout << *i << " ";
	}
	cout << endl;
	//在第一個元素以前插入111  insert begin+n是在第n個元素以前插入  
	v.insert(v.begin(), 111);
	//在最後一個元素以後插入222 insert end + n 是在n個元素以後插入  
	v.insert(v.end(), 222);
	for (vector<int>::iterator i = v.begin(); i != v.end(); ++i)
	{
		cout << *i << " ";
	}
	cout << endl;

	vector<int> arr(10);
	for (int i = 0; i < 10; i++)
	{
		arr[i] = i;
	}
	for (vector<int>::iterator i = arr.begin(); i != arr.end(); ++i)
	{
		cout << *i << " ";
	}
	cout << endl;
	//刪除 同insert  
	arr.erase(arr.begin());
	for (vector<int>::iterator i = arr.begin(); i != arr.end(); ++i)
	{
		cout << *i << " ";
	}
	cout << endl;
	arr.erase(arr.begin(), arr.begin() + 5);
	for (vector<int>::iterator i = arr.begin(); i != arr.end(); ++i)
	{
		cout << *i << " ";
	}
	cout << endl;
	system("pause");
	return 0;
}

結果輸出:
 下標 0
 迭代器
3 2 1 0
111 3 2 1 0 222
0 1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
6 7 8 9
複製代碼

####1.2.三、算法

函數庫對數據類型的選擇對其可重用性起着相當重要的做用。舉例來講,一個求方根的函數,在使用浮點數做爲其參數類型的狀況下的可重用性確定比使用整型做爲它的參數類性要高。而C++經過模板的機制容許推遲對某些類型的選擇,直到真正想使用模板或者說對模板進行特化的時候,STL就利用了這一點提供了至關多的有用算法。它是在一個有效的框架中完成這些算法的——你能夠將全部的類型劃分爲少數的幾類,而後就能夠在模版的參數中使用一種類型替換掉同一種類中的其餘類型。 STL提供了大約100個實現算法的模版函數,好比算法for_each將爲指定序列中的每個元素調用指定的函數,stable_sort以你所指定的規則對序列進行穩定性排序等等。只要咱們熟悉了STL以後,許多代碼能夠被大大的化簡,只須要經過調用一兩個算法模板,就能夠完成所須要的功能並大大地提高效率。 算法部分主要由頭文件,和組成。 是全部STL頭文件中最大的一個(儘管它很好理解),它是由一大堆模版函數組成的,能夠認爲每一個函數在很大程度上都是獨立的,其中經常使用到的功能範圍涉及到比較、交換、查找、遍歷操做、複製、修改、移除、反轉、排序、合併等等。 體積很小,只包括幾個在序列上面進行簡單數學運算的模板函數,包括加法和乘法在序列上的一些操做。 中則定義了一些模板類,用以聲明函數對象。

######數組反轉 ( reverse)示例以下:

#include<iostream> 
#include<vector> 
#include<algorithm> 
using namespace std;  
int main()  
{  
    vector<int> v;  
    for(int i = 0; i < 10; ++i)  
    {  
        v.push_back(i);  
    }  
    for(vector<int>::iterator it = v.begin(); it != v.end(); ++it)  
    {  
        cout << *it << " ";  
    }  
    cout << endl;  
    reverse(v.begin(),v.end());  
    for(vector<int>::iterator it = v.begin(); it != v.end(); ++it)  
    {  
        cout << *it << " ";  
    }  
    cout << endl;  
    return 0;  
}

結果輸出:
0 1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1 0
複製代碼

####總結 #####C++ 中STL 與Java中某些現有概念挺相似,例子看起來很簡單,實際上C++ 中STL中的知識內容其實挺晦澀難懂,不少內容我都省略了。之因此要學它,是由於有大量的開源庫,如ffmpeg使用了它。

#####參考: www.cnblogs.com/jchm/p/5443… blog.csdn.net/piaoxuezhon…

相關文章
相關標籤/搜索