1. 程式人生 > 實用技巧 >常用STL容器

常用STL容器

vector

標頭檔案<vector>

可變陣列,類似陣列。

構造方法

vector();
//構造一個空的vector
例 : vector<int> a;

vector( size_type num, const TYPE &val );
//構造一個初始放入num個值為val的元素的vector
例 : vector<int> v1( 5, 42 ); //構造了一個包含5個值為42的元素的vector

vector( const vector &from );
//構造一個與vector from 相同的vector 

vector( input_iterator start, input_iterator end );
//構造一個初始值為[start,end)區間元素的vector(注:半開區間). 

常用方法

push_back()

void push_back( const TYPE &val );

新增值為val的元素到當前vector末尾。

pop_back()

void pop_back();

刪除當前vector最末的一個元素。

clear()

void clear();

刪除當前vector中的所有元素。

注:不釋放記憶體,若要釋放記憶體,請用vector<ElementType>().swap(vec);

size()

size_type size();

size() 函式返回當前vector所容納元素的數目。

empty()

bool empty();

如果當前vector沒有容納任何元素,則empty()函式返回true,否則返回false。

修改元素

用=賦值即可。

vec[i] = x;

把 vec 裡下標為 i 的元素的值修改為 x.

二維vector

vector<vector<int> > vec2; 一維一維地賦值

注:<int> >中的空格不可省略;

set

標頭檔案<set>

集合,其中元素無重複。

構造方法

set();
//構造一個空的set
例 : set<int> a;

set( const set &from );
//構造一個與set from 相同的set 

set( input_iterator start, input_iterator end );
//構造一個初始值為[start,end)區間元素的set(注:半開區間). 

example

// constructing sets
#include <iostream>
#include <set>
using namespace std;

bool fncomp (int lhs, int rhs) {return lhs<rhs;}

struct classcomp {
  bool operator() (const int& lhs, const int& rhs) const
  {return lhs<rhs;}
};

int main ()
{
  set<int> first;                           // empty set of ints

  int myints[]= {10,20,30,40,50};
  set<int> second (myints,myints+5);        // pointers used as iterators

  set<int> third (second);                  // a copy of second

  set<int> fourth (second.begin(), second.end());  // iterator ctor.

  set<int,classcomp> fifth;                 // class as Compare

  bool(*fn_pt)(int,int) = fncomp;
  set<int,bool(*)(int,int)> sixth (fn_pt);  // function pointer as Compare

  return 0;
}

常用方法

insert()

iterator insert( iterator i, const TYPE &val );
//在迭代器i前插入val;

void insert( input_iterator start, input_iterator end );
//將迭代器start開始到end結束返回內的元素插入到集合中;

pair insert( const TYPE &val );
//在當前集合中插入val元素,並返回指向該元素的迭代器和一個布林值來說明val是否成功的被插入了。

注:插入兩個相同的元素是無效的。

count()

size_type count( const key_type &key );

返回當前集合中出現的某個值的元素的數目。

erase()

void erase( iterator i );
//刪除i元素;

void erase( iterator start, iterator end );
//刪除從start開始到end結束的元素;

size_type erase( const key_type &key );
//刪除等於key值的所有元素(返回被刪除的元素的個數)。

clear()

void clear();

刪除當前vector中的所有元素。

注:會清空記憶體。

size()

size_type size();

size() 函式返回當前vector所容納元素的數目。

empty()

bool empty();

如果當前vector沒有容納任何元素,則empty()函式返回true,否則返回false。

find()

iterator find( const key_type &key );

在當前集合中查詢等於key值的元素,並返回指向該元素的迭代器;如果沒有找到,返回指向集合最後一個元素的迭代器。

遍歷

迭代器set<T>::iterator it

for(set<T>::iterator it = s.begin(); it != s.end(); it++){
	//遍歷操作
}

注: 在C++裡遍歷set是從小到大排序的,也就是說set會幫我們排序。

map

標頭檔案<map>

對映,由關鍵字集合(key)值集合(value)組成。

構造方法

map();
//構造一個空的set
例 : map<char, int> first;

map( const map &from );
//構造一個與map from 相同的map
例 : map<char, int> second(first);

map( input_iterator start, input_iterator end );
//構造一個初始值為[start,end)區間元素的map(注:半開區間). 
例 : map<char, int> third(first.begin(), first.end());

常用函式

insert()

pair insert( const pair &val );

只有在val不存在時插入val。返回值是一個指向被插入元素的迭代器和一個描述是否插入的bool值。

pair是一個標準庫型別,定義在標頭檔案utility中。可以看成是有兩個成員變數firstsecond的結構體,並且過載了<運算子(先比較first大小,如果一樣再比較second)。當我們建立一個pair時,必須提供兩個型別。

pair的定義:pair<string, int> p;

樣例:

#include<map>
#include<string>
#include<utility>
using namespace std;
int main(){
    map<string, int> dict;
    dict.insert(make_pair("Tom", 1));
    //make_pair(V1, v2)函式返回由v1和v2初始化的pair,型別可以從v1和v2的值推斷出來。
}

注: 如果插入的key之前已經存在,將不會插入新的value值代替原來的,即本次插入無效。

count()

size_type count( const KEY_TYPE &key );

count()函式返回map中鍵值等於key的元素的個數。

如果存在返回1,否則0.

其他與set相似

對映的訪問

[]來訪問。

例:dict[key]

如沒有插入該key,則會返回value的對應型別的預設值。

也可以直接用本方法賦值來插入對映。

遍歷

使用迭代器遍歷,和set差不多。

迭代器定義:map<T1, T2>::iterator it;

迭代器指向的元素是一個pair,其成員firstsecond分別對應對映的keyvalue

->運算子來獲取值,it->first(*it).first.

for(map<T1, T2>::iterator it = dict.begin(); it != dict.end(); it++){
	//遍歷操作,例:
	cout << it->first << " -> " << it->second << endl;
}

注: 在C++裡遍歷map也是從小到大排序的。

二維

//map套set
map<T1, set<T2> > m1;

//map套map
map<T1, map<T2, T3> > m2;

stack

標頭檔案<stack>

只允許在棧的一端插入或刪除元素。(LIFO : Last In First Out)

構造方法

stack<T> s;  //空棧

stack<T> s( const Container& ctnr = Container() );
//通過別的容器來構造棧,ctnr可以是deque、vector.

常用函式

push()

void push( const TYPE &val );

val 值壓棧,使其成為棧頂的第一個元素。

pop()

void pop();

移除堆疊中最頂層元素。

size()

size_type size();

返回當前堆疊中的元素數目。

empty()

bool empty();

如當前堆疊為空,empty() 函式 返回 true 否則返回false.

top()

TYPE &top();

返回對棧頂元素的引用。