C++ STL 容器整理

順序性容器

一.<Vector>

Vectors 包含着一系列連續存儲的元素,其行爲和數組類似。訪問Vector中的任意元素或從末尾添加元素都可以在常量級時間複雜度內完成,而查找特定值的元素所處的位置或是在Vector中插入元素則是線性時間複雜度。

1.構造
vector<int> v1; //構造一個空的vector
vector<int> v1( 5, 42 ); //構造了一個包含5個值爲42的元素的Vector

2.back() 返回最末一個元素

3.begin() 返回第一個元素的迭代器

4.clear() 清空所有元素

5.empty() 判斷Vector是否爲空

6.insert() 插入元素到Vector中

語法:
iterator insert( iterator loc, const &val );
//在指定位置loc後插入值爲val的元素,返回指向這個元素的迭代器,
void insert( iterator loc, size_type num, const  &val );
//在指定位置loc後插入num個值爲val的元素
void insert( iterator loc, input_iterator start, input_iterator end );
//在指定位置loc後插入區間[start, end)的所有元素       

7. erase() 刪除指定元素

語法:
iterator erase( iterator loc );//刪除loc處的元素
iterator erase( iterator start, iterator end );//刪除start和end之間的元素

8.pop_back() 移除最後一個元素

9.push_back() 在Vector最後添加一個元素

10.size() 返回Vector元素數量的大小

11.swap() 交換兩個Vector
語法:
void swap( vector &from );

#include <iostream>
#include <cstdio>
#include <numeric>
#include <vector>
using namespace std;
vector<int> v;
int a[100];

int main()
{
	for (int i=1;i<=10;i++)
		{v.push_back(i);//把元素入v 
		 a[i]=i;}
	vector<int> ::iterator it;
	for (it=v.begin();it!=v.end();it++)//遍歷每一個元素 
		cout<<*it<<ends;
	cout<<endl<<accumulate(v.begin(),v.end(),0)<<endl;//求v.begin()到v.end()的和
	
	v.insert(it,10); //在it後插入10 
	v.insert(it,10,25); //在it後插入10個25 
	v.insert(it,a+1,a+10); //在it後插入a[1...9]中的所有元素
	 
	v.erase(it);//必須用迭代器it,但還不能給it賦值爲數字,故需用for把it賦值 
	v.erase(--it,it);//刪除it前一位到it的元素
	
	for (it=v.begin();it!=v.end();it++)//遍歷每一個元素 
		cout<<*it<<ends;

	return 0;
}

關聯容器

set 又稱集合,實際上就是一組元素的集合,但其中所包含的元素的值是唯一的,且是按一定順序排列的,集合中的每個元素被稱作集合中的實例。因爲其內部是通過鏈表的方式來組織,所以在插入的時候比vector 快,但在查找和末尾添加上比vector 慢。

multiset 是多重集合,其實現方式和set 是相似的,只是它不要求集合中的元素是唯一的,也就是說集合中的同一個元素可以出現多次。
map 提供一種“鍵- 值”關係的一對一的數據存儲能力。其“鍵”在容器中不可重複,且按一定順序排列(其實我們可以將set 也看成是一種鍵- 值關係的存儲,只是它只有鍵沒有值。它是map 的一種特殊形式)。由於其是按鏈表的方式存儲,它也繼承了鏈表的優缺點。
multimap 和map 的原理基本相似,它允許“鍵”在容器中可以不唯一。


二. <Sets> &< MultiSets>
集合(Set)是一種包含已排序對象的關聯容器。多元集合(MultiSets)和集合(Sets)相像,只不過支持重複對象,其用法與set基本相同。
1.begin() 返回指向第一個元素的迭代器

2.clear() 清除所有元素

3.count() 返回某個值元素的個數

4.empty() 如果集合爲空,返回true

5.end() 返回指向最後一個元素的迭代器

6.erase() 刪除集合中的元素

語法:
iterator erase( iterator i ); //刪除i位置元素
iterator erase( iterator start, iterator end );
//刪除從start開始到end(end爲第一個不被刪除的值)結束的元素
size_type erase( const key_type &key );
//刪除等於key值的所有元素(返回被刪除的元素的個數)

//前兩個返回第一個不被刪除的雙向定位器,不存在返回末尾
//第三個返回刪除個數
7.find() 返回一個指向被查找到元素的迭代器
語法:
iterator find( const key_type &key );
//查找等於key值的元素,並返回指向該元素的迭代器;
//如果沒有找到,返回指向集合最後一個元素的迭代器
8.insert() 在集合中插入元素
語法:
iterator insert( iterator i, const TYPE &val ); //在迭代器i後插入val
void insert( input_iterator start, input_iterator end );
//將迭代器start開始到end(end不被插入)結束返回內的元素插入到集合中
//應該注意的是在集合(Sets中不能插入兩個相同的元素)

9.lower_bound() 返回指向大於(或等於)某值的第一個元素的迭代器
語法:
iterator lower_bound( const key_type &key );
//返回一個指向大於或者等於key值的第一個元素的迭代器

10.upper_bound() 返回大於某個值元素的迭代器
語法:
iterator upwer_bound( const key_type &key );
//返回一個指向大於key值的第一個元素的迭代器

11.size() 集合中元素的數目

12.swap() 交換兩個集合變量
語法:
void swap( set &object ); //交換當前集合和object集合中的元素

三.<Maps> & <MultiMaps>

1.begin() 返回指向map頭部的迭代器
2.clear() 刪除所有元素
3.count() 返回指定元素出現的次數
語法:
size_type count( const KEY_TYPE &key );
//返回map中鍵值等於key的元素的個數
4.empty() 如果map爲空則返回true
5.end() 返回指向map末尾的迭代器
6.erase() 刪除一個元素
語法:
void erase( iterator i ); //刪除i元素
void erase( iterator start, iterator end ); //刪除從start開始到end(不包括end)結束的元素
size_type erase( const key_type &key );
//刪除等於key值的所有元素(返回被刪除的元素的個數)
7.find() 查找一個元素
語法:
iterator find( const key_type &key );
//查找等於key值的元素,並返回指向該元素的迭代器;
//如果沒有找到,返回指向集合最後一個元素的迭代器.
9.insert() 插入元素
語法:
iterator insert( iterator pos, const pair<KEY_TYPE,VALUE_TYPE> &val );
//插入val到pos的後面,然後返回一個指向這個元素的迭代器
void insert( input_iterator start, input_iterator end );
//插入start到end的元素到map中
10.lower_bound() 返回鍵值>=給定元素的第一個位置
語法:
iterator lower_bound( const key_type &key );
//返回一個指向大於或者等於key值的第一個元素的迭代器

11.upper_bound() 返回鍵值>給定元素的第一個位置

語法:
iterator upwer_bound( const key_type &key );
//返回一個指向大於key值的第一個元素的迭代器
12.size() 返回map中元素的個數

13.swap() 交換兩個map
語法:
void swap( map &obj );
//swap()交換obj和現map中的元素


容器適配器

STL 中包含三種適配器:棧stack 、隊列queue 和優先級priority_queue 。
STL 中提供的三種適配器可以由某一種順序容器去實現。默認下stack 和queue 基於deque 容器實現,priority_queue 則基於vector 容器實現。當然在創建一個適配器時也可以指定具體的實現容器,創建適配器時在第二個參數上指定具體的順序容器可以覆蓋適配器的默認實現。
由於適配器的特點,一個適配器不是可以由任一個順序容器都可以實現的
stack 的特點是後進先出,所以它關聯的基本容器可以是任意一種順序容器,因爲這些容器類型結構都可以提供棧的操作有求,它們都提供了push_back 、pop_back 和back 操作。
隊列queue 的特點是先進先出,適配器要求其關聯的基礎容器必須提供pop_front 操作,因此其不能建立在vector 容器上。

四.<Stacks>

1.empty() 堆棧爲空則返回真

2.pop() 移除棧頂元素

3.push() 在棧頂增加元素

4.size() 返回棧中元素數目

5.top() 返回棧頂元素


五.1.<queues>

1.back() 返回一個引用,指向最後一個元素
2.empty() 如果隊列空則返回真
3.front() 返回第一個元素
4.pop() 刪除第一個元素
5.push() 在末尾加入一個元素
6.size() 返回隊列中元素的個數

五.2.priority_queues

1.empty() 如果優先隊列爲空,則返回真

2.pop() 刪除第一個元素

3.push() 加入一個元素

4.size() 返回優先隊列中擁有的元素的個數

5.top() 返回優先隊列中有最高優先級的元素

struct cmp1
{  
    bool operator ()(int &a,int &b)
	{  
        return a>b;//最小值優先   
    }  
};  
struct cmp2
{  
    bool operator ()(int &a,int &b)
	{  
        return a<b;//最大值優先   
    }  
};  
struct node1
{  
    int u;  
    bool operator < (const node1 &a) const 
	{  
       return u>a.u;//最小值優先   
    }  
};  
struct node2
{  
	int u;  
	bool operator < (const node2 &a) const 
	{  
        return u<a.u;//最大值優先   
	}  
}; 

priority_queue<int>q1;//採用默認優先級構造隊列     
priority_queue<int,vector<int>,cmp1>q2;//最小值優先   
priority_queue<int,vector<int>,cmp2>q3;//最大值優先   
priority_queue<int,vector<int>,greater<int> >q4;//注意“>>”會被認爲錯誤,   
                                                //這是右移運算符,所以這裏用空格號隔開,最小值優先 
priority_queue<int,vector<int>,less<int> >q5;//最大值優先    
priority_queue<node1>q6;  //自定義優先級
priority_queue<node2>q7;


++++++++++++++++本文修改自《C++ 標準模板庫(STL)》,感謝其作者++++++++++++++++++++


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