1. 程式人生 > 實用技巧 >C++ STL

C++ STL

Vector(單端陣列)

一、vector 的初始化:

(1)vector<int> a(10); //定義了10個整型元素的向量(尖括號中為元素型別名,它可以是任何合法的資料型別),但沒有給出初值,其值是不確定的。
(2)vector<int> a(10,1); //定義了10個整型元素的向量,且給出每個元素的初值為1
(3)vector<int> a(b); //用b向量來建立a向量,整體複製性賦值
(4)vector<int> a(b.begin(),b.begin+3); //定義了a值為b中第0個到第2個(共3個)元素
(5)int b[7]={1,2,3,4,5,9,8};
        vector<int> a(b,b+7); //從陣列中獲得初值

二、vector物件的幾個重要操作

(1)a.assign(b.begin(), b.begin()+3); //b為向量,將b的0~2個元素構成的向量賦給a
(2)a.assign(4,2); //是a只含4個元素,且每個元素為2
(3)a.back(); //返回a的最後一個元素
(4)a.front(); //返回a的第一個元素
(5)a[i]; //返回a的第i個元素,當且僅當a[i]存在2013-12-07
(6)a.clear(); //清空a中的元素
(7)a.empty(); //判斷a是否為空,空則返回ture,不空則返回false
(8)a.pop_back(); //刪除a向量的最後一個元素
(9)a.erase(a.begin()+1,a.begin()+3); //刪除a中第1個(從第0個算起)到第2個元素,也就是說刪除的元素從a.begin()+1算起(包括它)一直到a.begin()+3(不包括它)
(10)a.push_back(5); //在a的最後一個向量後插入一個元素,其值為5
(11)a.insert(a.begin()+1,5); //在a的第1個元素(從第0個算起)的位置插入數值5,如a為1,2,3,4,插入元素後為1,5,2,3,4
(12)a.insert(a.begin()+1,3,5); //在a的第1個元素(從第0個算起)的位置插入3個數,其值都為5
(13)a.insert(a.begin()+1,b+3,b+6); //b為陣列,在a的第1個元素(從第0個算起)的位置插入b的第3個元素到第5個元素(不包括b+6),如b為1,2,3,4,5,9,8         ,插入元素後為1,4,5,9,2,3,4,5,9,8
(14)a.size(); //返回a中元素的個數;
(15)a.capacity(); //返回a在記憶體中總共可以容納的元素個數
(16)a.resize(10); //將a的現有元素個數調至10個,多則刪,少則補,其值隨機
(17)a.resize(10,2); //將a的現有元素個數調至10個,多則刪,少則補,其值為2
(18)a.reserve(100); //將a的容量(capacity)擴充至100,也就是說現在測試a.capacity();的時候返回值是100.這種操作只有在需要給a新增大量資料的時候才         顯得有意義,因為這將避免記憶體多次容量擴充操作(當a的容量不足時電腦會自動擴容,當然這必然降低效能) 
(19)a.swap(b); //b為向量,將a中的元素和b中的元素進行整體性交換
(20)a==b; //b為向量,向量的比較操作還有!=,>=,<=,>,<

三、順序訪問vector的幾種方式

deque(雙端陣列)

list(雙向連結串列)

set&multiset

map&multimap

string

for_each、transform(遍歷)

transform可以對容器的元素進行修改,for_each不可以

adjacent_find binary_search count count_if find find_if(查詢)

adjacent_find在iterator對標識元素範圍內,查詢一對相鄰重複元素,找到則返回指向這對元素的第一個元素的迭代器。否則返回past-the-end

vector<int> vecInt;
vecInt.push_back(1);
vecInt.push_back(2);
vecInt.push_back(2);
vecInt.push_back(4);
vecInt.push_back(5);
vecInt.push_back(5);

vector<int>::iterator it = adjacent_find(vecInt.begin(), vecInt.end());		//*it == 2

binary_search在有序序列中查詢value,找到則返回true。注意:在無序序列中,不可使用

set<int> setInt;
setInt.insert(3);
setInt.insert(1);
setInt.insert(7);
setInt.insert(5);
setInt.insert(9);

bool bFind = binary_search(setInt.begin(),setInt.end(),5);

count利用等於操作符,把標誌範圍內的元素與輸入值比較,返回相等的個數

vector<int> vecInt;
vecInt.push_back(1);
vecInt.push_back(2);
vecInt.push_back(2);
vecInt.push_back(4);
vecInt.push_back(2);
vecInt.push_back(5);
int iCount = count(vecInt.begin(),vecInt.end(),2);	//iCount==3

count_if

假設vector vecIntA,vecIntA包含1,3,5,7,9元素

//先定義比較函式
bool GreaterThree(int iNum)
{
    if(iNum>=3)
    {
        return true;
    }
    else
    {
        return false;
    }
}

int iCount = count_if(vecIntA.begin(), vecIntA.end(), GreaterThree);
//此時iCount == 4

find利用底層元素的等於操作符,對指定範圍內的元素與輸入值進行比較。當匹配時,結束搜尋,返回該元素的迭代器

vector<int> vecInt;
vecInt.push_back(1);
vecInt.push_back(3);
vecInt.push_back(5);
vecInt.push_back(7);
vecInt.push_back(9);

vector<int>::iterator it = find(vecInt.begin(), vecInt.end(), 5);		//*it == 5

find_if使用輸入的函式代替等於操作符執行find。返回被找到的元素的迭代器

假設vector<int> vecIntA,vecIntA包含1,3,5,3,9元素 
vector<int>::it = find_if(vecInt.begin(),vecInt.end(),GreaterThree);
此時 *it==3, *(it+1)==5, *(it+2)==3, *(it+3)==9

merge、sort、random_shuffle、reverse(排序)

merge合併兩個有序序列,存放到另一個序列

vecIntA,vecIntB,vecIntC是用vector<int>宣告的容器,vecIntA已包含1,3,5,7,9元素,vecIntB已包含2,4,6,8元素
vecIntC.resize(9);  //擴大容量
merge(vecIntA.begin(),vecIntA.end(),vecIntB.begin(),vecIntB.end(),vecIntC.begin());
此時vecIntC就存放了按順序的1,2,3,4,5,6,7,8,9九個元素

sort以預設升序的方式重新排列指定範圍內的元素。

//學生類
Class CStudent:
{
public:
    CStudent(int iID, string strName)
    {
        m_iID=iID;  
        m_strName=strName; 
    }
public:            
	int m_iID;
	string m_strName;
}

//學號比較函式
bool Compare(const CStudent &stuA,const CStudent &stuB)
{
    return (stuA.m_iID<strB.m_iID);
}
void main()
{
    vector<CStudent> vecStu;
    vecStu.push_back(CStudent(2,"老二"));
    vecStu.push_back(CStudent(1,"老大"));
    vecStu.push_back(CStudent(3,"老三"));
    vecStu.push_back(CStudent(4,"老四"));

    sort(vecStu.begin(),vecStu.end(),Compare);
//此時,vecStu容器包含了按順序的"老大物件","老二物件","老三物件","老四物件"
}

random_shuffle對指定範圍內的元素隨機調整次序。

vector<int> vecInt;
vecInt.push_back(1);
vecInt.push_back(3);
vecInt.push_back(5);
vecInt.push_back(7);
vecInt.push_back(9);

string str("itcastitcast ");

random_shuffle(vecInt.begin(), vecInt.end());   //隨機排序,結果比如:9,7,1,5,3
random_shuffle(str.begin(), str.end());		   //隨機排序,結果比如:" itstcasticat "

reverse

vector<int> vecInt;
vecInt.push_back(1);
vecInt.push_back(3);
vecInt.push_back(5);
vecInt.push_back(7);
vecInt.push_back(9);

reverse(vecInt.begin(), vecInt.end());		//{9,7,5,3,1}

copy replace replace_if swap(拷貝和替換)

copy

vector<int> vecIntA;
vecIntA.push_back(1);
vecIntA.push_back(3);
vecIntA.push_back(5);
vecIntA.push_back(7);
vecIntA.push_back(9);

vector<int> vecIntB;
vecIntB.resize(5);			//擴大空間

copy(vecIntA.begin(), vecIntA.end(), vecIntB.begin());	//vecIntB: {1,3,5,7,9}

replace將指定範圍內的所有等於oldValue的元素替換成newValue

vector<int> vecIntA;
vecIntA.push_back(1);
vecIntA.push_back(3);
vecIntA.push_back(5);
vecIntA.push_back(3);
vecIntA.push_back(9);

replace(vecIntA.begin(), vecIntA.end(), 3, 8);		//{1,8,5,8,9}

replace_if 將指定範圍內所有操作結果為true的元素用新值替換。

GreaterThree 函式的原型是 bool GreaterThree(int iNum)

//把大於等於3的元素替換成8
vector<int> vecIntA;
vecIntA.push_back(1);
vecIntA.push_back(3);
vecIntA.push_back(5);
vecIntA.push_back(3);
vecIntA.push_back(9);

replace_if(vecIntA.begin(), vecIntA.end(), GreaterThree, 8);// GreaterThree的定義在上面。

swap交換兩個容器的元素

vector<int> vecIntA;
vecIntA.push_back(1);
vecIntA.push_back(3);
vecIntA.push_back(5);

vector<int> vecIntB;
vecIntB.push_back(2);
vecIntB.push_back(4);

swap(vecIntA, vecIntB);  //交換

accumulate、fill(算術和生成)

accumulate對指定範圍內的元素求和,然後結果再加上一個由val指定的初始值

#include<numeric>

vector<int> vecIntA;
vecIntA.push_back(1);
vecIntA.push_back(3);
vecIntA.push_back(5);
vecIntA.push_back(7);
vecIntA.push_back(9);
int iSum = accumulate(vecIntA.begin(), vecIntA.end(), 100);		//iSum==125

fill將輸入值賦給標誌範圍內的所有元素

vector<int> vecIntA;
vecIntA.push_back(1);
vecIntA.push_back(3);
vecIntA.push_back(5);
vecIntA.push_back(7);
vecIntA.push_back(9);
fill(vecIntA.begin(), vecIntA.end(), 8);		//8, 8, 8, 8, 8

set_union、set_intersection、set_difference(集合)

vector<int> vecIntA = {1, 3, 5, 7, 9};

vector<int> vecIntB = {1, 3, 5, 6, 8};

vector<int> vecIntC;
vecIntC.resize(10);

set_union

set_union(vecIntA.begin(), vecIntA.end(), vecIntB.begin(), vecIntB.end(), vecIntC.begin());//vecIntC : {1,3,5,6,7,8,9,0,0,0}

set_intersection

fill(vecIntC.begin(),vecIntC.end(),0);
set_intersection(vecIntA.begin(), vecIntA.end(), vecIntB.begin(), vecIntB.end(), vecIntC.begin());//vecIntC: {1,3,5,0,0,0,0,0,0,0}

set_difference

fill(vecIntC.begin(),vecIntC.end(),0);
set_difference(vecIntA.begin(), vecIntA.end(), vecIntB.begin(), vecIntB.end(), vecIntC.begin());//vecIntC: {7,9,0,0,0,0,0,0,0,0}