1. 程式人生 > >c++ list, vector, map, set 區別與用法比較

c++ list, vector, map, set 區別與用法比較

List封裝了連結串列,Vector封裝了陣列, list和vector得最主要的區別在於vector使用連續記憶體儲存的,他支援[]運算子,而list是以連結串列形式實現的,不支援[]。

Vector對於隨機訪問的速度很快,但是對於插入尤其是在頭部插入元素速度很慢,在尾部插入速度很快。List對於隨機訪問速度慢得多,因為可能要遍歷整個連結串列才能做到,但是對於插入就快的多了,不需要拷貝和移動資料,只需要改變指標的指向就可以了。另外對於新新增的元素,Vector有一套演算法,而List可以任意加入。 Map,Set屬於標準關聯容器,使用了非常高效的平衡檢索二叉樹:紅黑樹,他的插入刪除效率比其他序列容器高是因為不需要做記憶體拷貝和記憶體移動,而直接替換指向節點的指標即可。 Set和Vector的區別在於Set不包含重複的資料。Set和Map的區別在於Set只含有Key,而Map有一個Key和Key所對應的Value兩個元素。 Map和Hash_Map的區別是Hash_Map使用了Hash演算法來加快查詢過程,但是需要更多的記憶體來存放這些Hash桶元素,因此可以算得上是採用空間來換取時間策略。

vector

    向量 相當於一個數組     在記憶體中分配一塊連續的記憶體空間進行儲存。支援不指定vector大小的儲存。STL內部實現時,首先分配一個非常大的記憶體空間預備進行儲存,即capacituy()函式返回的大小,當超過此分配的空間時再整體重新放分配一塊記憶體儲存,這給人以vector可以不指定vector即一個連續記憶體的大小的感覺。通常此預設的記憶體分配能完成大部分情況下的儲存。    優點:(1) 不指定一塊記憶體大小的陣列的連續儲存,即可以像陣列一樣操作,但可以對此陣列                進行動態操作。通常體現在push_back() pop_back()                (2) 隨機訪問方便,即支援[ ]操作符和vector.at()                (3) 節省空間。    缺點:(1) 在內部進行插入刪除操作效率低。                (2) 只能在vector的最後進行push和pop,不能在vector的頭進行push和pop。                (3) 當動態新增的資料超過vector預設分配的大小時要進行整體的重新分配、拷貝與釋                      放  2 list

    雙向連結串列     每一個結點都包括一個資訊快Info、一個前驅指標Pre、一個後驅指標Post。可以不分配必須的記憶體大小方便的進行新增和刪除操作。使用的是非連續的記憶體空間進行儲存。    優點:(1) 不使用連續記憶體完成動態操作。                (2) 在內部方便的進行插入和刪除操作                (3) 可在兩端進行push、pop    缺點:(1) 不能進行內部的隨機訪問,即不支援[ ]操作符和vector.at()                (2) 相對於verctor佔用記憶體多 3 deque    雙端佇列 double-end queue    deque是在功能上合併了vector和list。    優點:(1) 隨機訪問方便,即支援[ ]操作符和vector.at()                (2) 在內部方便的進行插入和刪除操作                (3) 可在兩端進行push、pop    缺點:(1) 佔用記憶體多使用區別:
     1 如果你需要高效的隨即存取,而不在乎插入和刪除的效率,使用vector       2 如果你需要大量的插入和刪除,而不關心隨即存取,則應使用list       3 如果你需要隨即存取,而且關心兩端資料的插入和刪除,則應使用deque

C++STL中vector容器的用法 

http://xiamaogeng.blog.163.com/blog/static/1670023742010102494039234/

vector是C++標準模板庫中的部分內容,它是一個多功能的,能夠操作多種資料結構和演算法的模板類和函式庫。vector之所以被認為是一個容器,是因為它能夠像容器一樣存放各種型別的物件,簡單地說vector是一個能夠存放任意型別的動態陣列,能夠增加和壓縮資料。為了可以使用vector,必須在你的標頭檔案中包含下面的程式碼:

#include <vector>

vector屬於std命名域的,因此需要通過命名限定,如下完成你的程式碼:

using std::vector;     vector<int> v;

或者連在一起,使用全名:

std::vector<int> v;

建議使用全域性的命名域方式:

using namespace std;

1.vector的宣告

   vector<ElemType> c;   建立一個空的vector

   vector<ElemType> c1(c2); 建立一個vector c1,並用c2去初始化c1

   vector<ElemType> c(n) ; 建立一個含有n個ElemType型別資料的vector;

   vector<ElemType> c(n,elem); 建立一個含有n個ElemType型別資料的vector,並全部初始化為elem;

   c.~vector<ElemType>(); 銷燬所有資料,釋放資源;

2.vector容器中常用的函式。(c為一個容器物件)

    c.push_back(elem);   在容器最後位置新增一個元素elem

    c.pop_back();            刪除容器最後位置處的元素

    c.at(index);                返回指定index位置處的元素

    c.begin();                   返回指向容器最開始位置資料的指標

    c.end();                      返回指向容器最後一個數據單元的指標+1

    c.front();                     返回容器最開始單元資料的引用

    c.back();                     返回容器最後一個數據的引用

    c.max_size();              返回容器的最大容量

    c.size();                      返回當前容器中實際存放元素的個數

    c.capacity();               同c.size()

     c.resize();                   重新設定vector的容量

    c.reserve();                同c.resize()

    c.erase(p);               刪除指標p指向位置的資料,返回下指向下一個資料位置的指標(迭代器)

    c.erase(begin,end)     刪除begin,end區間的資料,返回指向下一個資料位置的指標(迭代器)

    c.clear();                    清除所有資料

    c.rbegin();                  將vector反轉後的開始指標返回(其實就是原來的end-1)

    c.rend();                     將vector反轉後的結束指標返回(其實就是原來的begin-1)

    c.empty();                   判斷容器是否為空,若為空返回true,否則返回false

    c1.swap(c2);               交換兩個容器中的資料

    c.insert(p,elem);          在指標p指向的位置插入資料elem,返回指向elem位置的指標       

    c.insert(p,n,elem);      在位置p插入n個elem資料,無返回值

    c.insert(p,begin,end) 在位置p插入在區間[begin,end)的資料,無返回值

3.vector中的操作

    operator[] 如: c.[i];

    同at()函式的作用相同,即取容器中的資料。

在上大致講述了vector類中所含有的函式和操作,下面繼續討論如何使用vector容器;

1.資料的輸入和刪除。push_back()與pop_back()

C++STL中vector容器的用法 - 夏茂庚 - 夏茂庚 2.元素的訪問

C++STL中vector容器的用法 - 夏茂庚 - 夏茂庚 3.排序和查詢

C++STL中vector容器的用法 - 夏茂庚 - 夏茂庚

4.二維容器

C++STL中vector容器的用法 - 夏茂庚 - 夏茂庚

http://www.cnblogs.com/madlas/articles/1364503.html

C++ STL List佇列用法(例項)

2007-12-15 12:54

#include <iostream> #include <list> #include <numeric> #include <algorithm>

using namespace std;

//建立一個list容器的例項LISTINT typedef list<int> LISTINT;

//建立一個list容器的例項LISTCHAR typedef list<char> LISTCHAR;

void main(void) {     //--------------------------     //用list容器處理整型資料     //--------------------------     //用LISTINT建立一個名為listOne的list物件     LISTINT listOne;     //宣告i為迭代器     LISTINT::iterator i;

    //從前面向listOne容器中新增資料     listOne.push_front (2);     listOne.push_front (1);

    //從後面向listOne容器中新增資料     listOne.push_back (3);     listOne.push_back (4);

    //從前向後顯示listOne中的資料     cout<<"listOne.begin()--- listOne.end():"<<endl;     for (i = listOne.begin(); i != listOne.end(); ++i)         cout << *i << " ";     cout << endl;

    //從後向後顯示listOne中的資料 LISTINT::reverse_iterator ir;     cout<<"listOne.rbegin()---listOne.rend():"<<endl;     for (ir =listOne.rbegin(); ir!=listOne.rend();ir++) {         cout << *ir << " ";     }     cout << endl;

    //使用STL的accumulate(累加)演算法     int result = accumulate(listOne.begin(), listOne.end(),0);     cout<<"Sum="<<result<<endl;     cout<<"------------------"<<endl;

    //--------------------------     //用list容器處理字元型資料     //--------------------------

    //用LISTCHAR建立一個名為listOne的list物件     LISTCHAR listTwo;     //宣告i為迭代器     LISTCHAR::iterator j;

    //從前面向listTwo容器中新增資料     listTwo.push_front ('A');     listTwo.push_front ('B');

    //從後面向listTwo容器中新增資料     listTwo.push_back ('x');     listTwo.push_back ('y');

    //從前向後顯示listTwo中的資料     cout<<"listTwo.begin()---listTwo.end():"<<endl;     for (j = listTwo.begin(); j != listTwo.end(); ++j)         cout << char(*j) << " ";     cout << endl;

    //使用STL的max_element演算法求listTwo中的最大元素並顯示     j=max_element(listTwo.begin(),listTwo.end());     cout << "The maximum element in listTwo is: "<<char(*j)<<endl; }

#include <iostream> #include <list>

using namespace std; typedef list<int> INTLIST;

//從前向後顯示list佇列的全部元素 void put_list(INTLISTlist, char *name) {     INTLIST::iterator plist;

    cout << "The contents of " << name << " : ";     for(plist = list.begin(); plist != list.end(); plist++)         cout << *plist << " ";     cout<<endl; }

//測試list容器的功能 void main(void) { //list1物件初始為空     INTLIST list1;       //list2物件最初有10個值為6的元素     INTLIST list2(10,6);     //list3物件最初有3個值為6的元素     INTLIST list3(list2.begin(),--list2.end());

    //宣告一個名為i的雙向迭代器     INTLIST::iterator i;

    //從前向後顯示各list物件的元素     put_list(list1,"list1");     put_list(list2,"list2");     put_list(list3,"list3");     //從list1序列後面新增兩個元素 list1.push_back(2); list1.push_back(4); cout<<"list1.push_back(2) andlist1.push_back(4):"<<endl;     put_list(list1,"list1");

//從list1序列前面新增兩個元素 list1.push_front(5); list1.push_front(7); cout<<"list1.push_front(5) andlist1.push_front(7):"<<endl;     put_list(list1,"list1");

//在list1序列中間插入資料 list1.insert(++list1.begin(),3,9); cout<<"list1.insert(list1.begin()+1,3,9):"<<endl;     put_list(list1,"list1");

//測試引用類函式 cout<<"list1.front()="<<list1.front()<<endl; cout<<"list1.back()="<<list1.back()<<endl;

//從list1序列的前後各移去一個元素 list1.pop_front(); list1.pop_back(); cout<<"list1.pop_front() andlist1.pop_back():"<<endl;     put_list(list1,"list1");

//清除list1中的第2個元素 list1.erase(++list1.begin()); cout<<"list1.erase(++list1.begin()):"<<endl;     put_list(list1,"list1");

//對list2賦值並顯示 list2.assign(8,1); cout<<"list2.assign(8,1):"<<endl;     put_list(list2,"list2");

//顯示序列的狀態資訊 cout<<"list1.max_size(): "<<list1.max_size()<<endl; cout<<"list1.size(): "<<list1.size()<<endl; cout<<"list1.empty(): "<<list1.empty()<<endl;

//list序列容器的運算     put_list(list1,"list1");     put_list(list3,"list3"); cout<<"list1>list3: "<<(list1>list3)<<endl; cout<<"list1<list3: "<<(list1<list3)<<endl;

//對list1容器排序 list1.sort();     put_list(list1,"list1");     //結合處理 list1.splice(++list1.begin(),list3);     put_list(list1,"list1");     put_list(list3,"list3"); }