STL

最近碰到一道題,不用STL有些麻煩,我於是調了很久。於是一位同學發話了:“你tm不能用STL嗎?”

我:我就是**,*外面,從這跳下去,也不用STL一下!!!

於是真香了


進入主題:

STL (模板庫)

STL是Standard Template Library的簡稱,中文名標準模板庫,惠普實驗室開發的一系列軟件的統稱。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普實驗室工作時所開發出來的。從根本上說,STL是一些“容器”的集合,這些“容器”有list,vector,set,map等,STL也是算法和其他一些組件的集合。這裏的“容器”和算法的集合指的是世界上很多聰明人很多年的傑作。STL的目的是標準化組件,這樣就不用重新開發,可以使用現成的組件。STL現在是C++的一部分,因此不用安裝額外的庫文件。STL的版本很多,常見的有HP STL、PJ STL、 SGI STL等。–百度百科

STL可分爲容器(containers)、迭代器(iterators)、空間配置器(allocator)、配接器(adapters)、算法(algorithms)、仿函數(functors)六個部分。
容器部分主要由頭文件< vector >,< list >,< deque >,< set >,< map >,< stack >和組成。對於常用的一些容器和容器適配器(可以看作由其它容器實現的容器),可以通過下表總結一下它們和相應頭文件的對應關係。
序列式容器
向量(vector) 連續存儲的元素< vector >
列表(list) 由節點組成的雙向鏈表,每個結點包含着一個元素< list >
雙端隊列(deque) 連續存儲的指向不同元素的指針所組成的數組< deque >
適配器容器
棧(stack) 後進先出(LIFO)的值的排列 < stack >
隊列(queue) 先進先出(FIFO)的值的排列 < queue >
優先隊列(priority_queue) 元素的次序是由作用於所存儲的值對上的某種謂詞決定的的一種隊列 < queue >
關聯式容器
集合(set) 由節點組成的紅黑樹,每個節點都包含着一個元素,節點之間以某種作用於元素隊的謂詞排列,沒有兩個不同的元素能夠擁有相同的次序 < set >
多重集合(multiset) 允許存在兩個次序相等的元素的集合 < set >
映射(map) 由{鍵,值}對組成的集合,以某種作用於鍵對上的謂詞排列 < map >
多重映射(multimap) 允許鍵對有相等的次序的映射 < map >
現在我們講講各種函數的使用方法。

vector

我在藍書上1看到過有關的描述,那個時候就感覺這個沒什麼鳥用,雖然現在也是這樣。

1.介紹

vector是C++標準模板庫中的部分內容,中文偶爾譯作“容器”,但並不準確。它是一個多功能的,能夠操作多種數據結構和算法的模板類和函數庫。vector之所以被認爲是一個容器,是因爲它能夠像容器一樣存放各種類型的對象,簡單地說,vector是一個能夠存放任意類型的動態數組,能夠增加和壓縮數據。–by 百度百科

2.函數及其使用方法

先看看vector的函數列表:

    constructors                構造函數 
    operators                   對vector進行賦值或比較 
    assign()                    對vector中的元素賦值 
    at()                        返回指定位置的元素 
    back()                      返回最末一個元素 
    begin()                     返回第一個元素的迭代器 
    capacity()                  返回vector所能容納的元素數量(在不重新分配內存的情況下) 
    clear()                     清空所有元素 
    empty()                     判斷vector是否爲空(返回true時爲空) 
    end()                       返回最末元素的迭代器(實際上指向最末元素的下一個位置) 
    erase()                     刪除指定元素 
    front()                     返回第一個元素 
    get_allocator()             返回vector的內存分配器 
    insert()                    插入元素到vector中 
    max_size()                  返回vector所能容納元素的最大數量(上限) 
    pop_back()                  移除最後一個元素 
    push_back()                 在vector最後添加一個元素 
    rbegin()                    返回vector尾部的逆迭代器 
    rend()                      返回vector起始的逆迭代器 
    reserve()                   設置vector最小的元素容納數量 
    resize()                    改變vector元素數量的大小 
    size()                      返回vector元素數量的大小 
    swap()                      交換兩個vector
現在我們具體講講函數用法:

當然,不會全部講,畢竟有一些函數並不常用。
首先說說vector支持的運算符操作:(==!=&gt;=&lt;===,!=,&gt;=,&lt;=,>,<),這個比較標準是兩個vector內有相同的容量,所有相等位置的元素相同。訪問位置與數組相同。

0.迭代器:

迭代器相當於數組的下標。當你要輸出這個位置確切的值的時候在前面加*就可以了。
栗子:

    vector<int>vec;
    vec.push_back(5);//即在vec裏面插入一個5. 
    vector<int>::iterator it=vec.begin();//即找到vector裏面的第一個元素位置 
    printf("%d ",*it);

這份代碼的輸出是5。

1. at()函數使用方法:

at函數效果和[][]類似,類數組訪問:vector[x],at函數訪問方法vector .at(x);
栗子:

	vector<int>vec;
	vec.push_back(1);
	vec.push_back(3);
	printf("%d %d",vec.at(0),vec.at(1));//at()函數用法
	vector<int>vec;	
	vec.push_back(1);
	vec.push_back(3);
	printf("%d %d",vec[0],vec[1]);//數組用法

這兩份代碼輸出的都是1 3。

2.front()&back()函數使用方法:

front()函數返回vector的第一個元素的值,back()函數返回vector的最末元素值。
栗子:

	vector<int>vec;
	vec.push_back(5);
	vec.push_back(1);
	vec.push_back(4);
	vec.push_back(3);
	printf("%d %d",vec.front(),vec.back());

這份代碼的輸出是5 3。

3.begin()&end()函數使用方法:

begin()函數返回vector的第一個元素的迭代器,end()使但是end()函數返回的是最末元素的下一個位置的迭代器!!!所以使用時候千萬小心。
栗子:

	vector<int>vec;
	vec.push_back(5);
	vec.push_back(1);
	vec.push_back(4);
	vec.push_back(3);
	printf("%d %d",*vec.begin(),*--vec.end());

這份代碼輸出的是5 3。
反慄:

	vector<int>vec;
	vec.push_back(5);
	vec.push_back(1);
	vec.push_back(4);
	vec.push_back(3);
	printf("%d %d",*vec.begin(),*vec.end());

如果你按照這個方法去輸出vec的最後一個值,恭喜你,你所謂的最末元素會顯得特別和諧。
vector如果你想遍歷一個vector,做法特變簡單。
做法:

	vector<int>vec;
	vec.push_back(5);
	vec.push_back(1);
	vec.push_back(4);
	vec.push_back(3);
	vector<int>::iterator it;
	for(it=vec.begin();it!=vec.end();it++)
	printf("%d ",*it);

這份代碼的輸出是5 1 4 3。

4.clear()函數使用方法:

該函數用來清空一個vector函數,可以回收內存。
栗子:

	vector<int>vec;
	vec.push_back(5);
	vec.push_back(1);
	vec.push_back(4);
	vec.push_back(3);
	vec.clear();
	vector<int>::iterator it;
	for(it=vec.begin();it!=vec.end();it++)
	printf("%d ",*it);

這份代碼啥也沒有輸出。

empty()函數使用方法:

該函數用來判斷vector是否爲空(空則返回一,否則返回零)。
栗子(此處用了erase()函數2):

    vector<int>vec;
    vec.push_back(5);
    vec.push_back(4);
    vec.push_back(3);
    vec.push_back(2);
    vec.push_back(1);
    while(!vec.empty()){
    	printf("%d ",*vec.begin());
    	vec.erase(vec.begin());
	}

這份代碼的輸出是5 4 3 2 1。

erase()函數使用方法:

這個函數用來刪除vector裏面的元素,它可以刪除一個元素,也可以刪除一個區間3的元素。
栗子:

    vector<int>vec;
    vec.push_back(5);
    vec.push_back(4);
    vec.push_back(3);
    vec.push_back(2);
    vec.push_back(1);
    vec.erase(vec.begin(),vec.begin()+=2);
    while(!vec.empty()){
    	printf("%d ",*vec.begin());
    	vec.erase(vec.begin());
	}

這份代碼的輸出是3 2 1。

insert()函數使用方法:

這個函數用來在一個元素插入另一個元素。
栗子:

    vector<int>vec;
    vec.push_back(5);
    vec.insert(vec.begin(),4);
    vec.insert(vec.begin(),3);
    vec.insert(vec.begin(),2);
    vec.insert(vec.begin(),1);
    vector<int>::iterator it;
    for(it=vec.begin();it!=vec.end();++it)
    printf("%d ",*it);

這份代碼的輸出是1 2 3 4 5。

pop_back(),push_back()函數使用方法:

pop_back()函數用於將vector最末元素刪除,push_back()函數也在前面的栗子中出現了很多次,就是在vector末尾插入一個數。
栗子:

    vector<int>vec;
    vec.push_back(5);
    vec.push_back(4);
    vec.push_back(3);
    vec.push_back(2);
    vec.push_back(1);
    while(!vec.empty())vec.pop_back();
    vector<int>::iterator it;
    for(it=vec.begin();it!=vec.end();++it)
    printf("%d ",*it);

這份代碼什麼也沒有輸出。

size()函數使用方法:

該函數用於返回vector中當前元素的個數。
栗子:

    vector<int>vec;
    vec.push_back(5);
    vec.push_back(4);
    vec.push_back(3);
    vec.push_back(2);
    vec.push_back(1);
    while(vec.size())vec.pop_back();
    vector<int>::iterator it;
    for(it=vec.begin();it!=vec.end();++it)
    printf("%d ",*it);

這份代碼也什麼都沒有輸出。

相關例題及其分析

emmm目前我還沒有找到。。。再說吧。


  1. 《算法進階指南》 ↩︎

  2. erase()函數就是可以把一個位置的元素刪除。 ↩︎

  3. 左閉右開 ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章