1. 程式人生 > >C++容器類的介紹和例子原始碼

C++容器類的介紹和例子原始碼



剛接觸容器時,可以簡單的把他看做一個可以各種型別(struct也是可以的)的陣列,思路和操作也和陣列差不多,就是命令使用的有些區別


C++容器類的簡單介紹


一、原型與建構函式
Vector的原型可定義為
vector >
其建構函式為
vector() //空的
vector(al) //指定一種allocator
vector(n) //用預設T()初始化n個元素
vector(n, val) //用Val初始化n個元素
vector(n,val,al) //用val初始化n個元素,用al做分配器
vector(first,last) //從己有的first到last複製生成
vector(first,last,al) //從己有的first到last複製生成,用al做分配器




二、操作
1.開闢N個空間
vecobj.reserve(N);


2.當前(重新分配記憶體前)得到最大容量
capacity();


3.重新分配記憶體為N
resize(N)
如果變小,則刪除多餘。如果變大,則用T()添充


4.清空
clear();
注意,clear()和resize()都不一定使得vector變小,若欲釋放記憶體,請使用vecobj.swap(vector())


5.存取首尾元素
front()與back()操作,取後一個和最前一個元素,注意其返回是引用,其而是左值(l_value),因此可以賦值. 做類似於vecobj.front() = 3;的操作,但


要保證front空間有效,否則形為無法預測。


6.取值
[]與at可以做此操作,at會檢查,如果越界有會out_of_range的異常被throw


7.push_back:作用為在vector尾部加入一個數據
             push_back函式的意思是在vector的末尾插入一個元素。
    vector簡單理解為動態一維陣列push_back作用是在這個一維陣列尾部插入一個元素      


             vector<int> v;
             v.push_back(1); //v裡面是: 1
             v.push_back(2); //v裡面是: 1 , 2
             v.push_back(3); //v裡面是: 1 , 2 , 3。


  pop_back: 作用為刪除最後一個元素


8.使用assign
assign可以改變大小和初值,大小是隨意的,不受開始時大小的限制,如果設定為0,則清空。
assign(5,0)把vector改為5個大小,並用0添充
assign(iax+3,iax+5); 從陣列第4到5個填充,注意左閉右開,即可取到iax[3]與iax[4]


9.使用insert
insert(it, x),在it前插入一個元素x
insert(it,first,last),在it前插入一個序列[first,last)左閉右開


10.使用erase
erase(it)刪除在it處的元素,返回值為下一元素。如果intVec.erase(intVec.end());並不會報錯,如果刪除一個序列[first,last),使用erase


(first,last)


11.BVector是vector的特化版,具體的用途有待查證


12.flip()把某一元素,求反。


13.swap. vecObj.swap(vecObj[i],vecObj[j]);
若要在容器中裝一個物件並且能並檢索,需要過載operator == ,如下:
#include 
#include 
#include 
#include 
//#include 
using namespace std;


class Obj
{
public:
Obj(int x, int y, int z)
{
this->x = x;
this->y = y;
this->z = z;
}
}


bool operator == (const Obj & obj)
{
if(obj.x == x && obj.y == y && obj.z == z)
{
return true;
}
return false;
}
int getX()
{
return this -> x;
}
private:
int x;
int y;
int z;
}


int main(int argc, char * argv[])
{
vector vecObj;
Obj obj1(2,3,4);
Obj obj2(4,5,6);
vecObj.push_back(obj1);
vecObj.push_back(obj2);


vector::iterator it =find(vecObj.begin(),vecObj.end(),Obj(2,3,4));
if(it != vecObj.end())
cout << (*it).getX() << endl;
return 0;
}




list的基本用法


與vector的用法基本相同,其中需要強調一點的是splice()函式,是指把指定段的另一個List插入到指定位置的前面。
splice(iterator it , list &x)
splice(iterator it, list &x, iterator first)
splice(iterator it,list &x, iterator first, iterator last)


一、原型與建構函式
typdef list > listObj;
建構函式
list() //空
list(al) //指定allocator的空表
list(n)//n個元素,所有元素都是T()出來的
list(n,val)//n個元素,所有元素都是T(val)出來的
list(n,val,al)//同上,並指定allocator為al
list(first, last) //複製構造
list(first,last,al) //指定allocator構造


二、操作
1.resize & clear
使用resize(n)改變大小,使用resize(n, val)如果需要用T(val) 來填滿空閒值。


2.front ()& back()
如果listObj非常量物件,返回是一個左值函式


3.插入操作
insert(iterator it , val)
insert(iterator it, first, last)
insert(iteratot it, n, x)//插入n個x


4.移除
remove(x); //vector.erase(integrator it)


按值刪
int iax[] ={3,4,5,6,6,7,8}
list lObj;
lObj.insert(lObj.begin(),iax, iax + 7);
lObj.remove(6); //
按函式條件刪


#include 
#include 
using namespace std;
// a predicate implemented as a function:
bool single_digit (const int& value) { return (value<10); }
// a predicate implemented as a class:
class is_odd
{
public:
bool operator() (const int& value) {return (value%2)==1; }
};
int main ()
{
int myints[]= {15,36,7,17,20,39,4,1};
list mylist (myints,myints+8); // 15 36 7 17 20 39 4 1
mylist.remove_if (single_digit); // 15 36 17 20 39
mylist.remove_if (is_odd()); // 36 20
cout << "mylist contains:";
for (list::iterator it




=mylist.begin(); it!=mylist.end(); ++it)
cout << " " << *it;
cout << endl;
return 0;
}
當然,對於class is_odd,也可以寫成
template 
class is_odd
{
};
呼叫時,則要改成
mylist.remove_if(is_odd());