STL_經常使用的算法

STL_經常使用的算法

1、經常使用的查找算法

adjacent_find()

adjacent_find(iterator beg, iterator end, _callback);算法

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

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()

bool binary_search(iterator beg, iterator end, value);函數

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

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);//nFind=true

count()

count(iterator beg, iterator end, value);orm

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

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()

count_if(首迭代器,未迭代器,搜索值(要比較的值的結果))(條件計數)排序

//假設vector<int> 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()

find(iterator beg, iterator end, value)內存

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_if(iterator beg, iterator end, _callback);(條件查找)string

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

2、經常使用的排序算法

merge()

如下是排序和通用算法:提供元素排序策略

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()

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()

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

srand(time(0));             //設置隨機種子
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()

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}

3、經常使用的拷貝和替換算法

copy()

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()

replace(beg,end,oldValue,newValue): 將指定範圍內的全部等於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()

/*
	replace_if算法 將容器內指定範圍知足條件的元素替換爲新元素
	@param beg 容器開始迭代器
	@param end 容器結束迭代器
	@param callback函數回調或者謂詞(返回Bool類型的函數對象)
	@param oldvalue 新元素
*/
replace_if(iterator beg, iterator end, _callback, newvalue)

replace_if : 將指定範圍內全部操做結果爲true的元素用新值替換。

//把大於等於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()

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); //交換

4、經常使用的算術和生成算法

accumulate()

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()

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

5、經常使用的集合算法

set_union(),set_intersection(),set_difference()

set_union: 構造一個有序序列,包含兩個有序序列的並集。

set_intersection: 構造一個有序序列,包含兩個有序序列的交集。

set_difference: 構造一個有序序列,該序列保留第一個有序序列中存在而第二個有序序列中不存在的元素。

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.push_back(1);
vecIntB.push_back(3);
vecIntB.push_back(5);
vecIntB.push_back(6);
vecIntB.push_back(8);

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

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

//交集
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}

//差集
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}

6、經常使用的遍歷算法

for_each()

/*
    遍歷算法 遍歷容器元素
	@param beg 開始迭代器
	@param end 結束迭代器
	@param _callback  函數回調或者函數對象
	@return 函數對象
*/
for_each(iterator beg, iterator end, _callback);

for_each: 用指定函數依次對指定範圍內全部元素進行迭代訪問。該函數不得修改序列中的元素。

void show(const int &iItem){
    cout << iItem;
}

main()
{
    int iArray[] = {0,1,2,3,4};
    vector<int> vecInt(iArray,iArray+sizeof(iArray)/sizeof(iArray[0]));
	for_each(vecInt.begin(), vecInt.end(), show);
//結果打印出0 1 2 3 4
}

transform()

/*
	transform算法 將指定容器區間元素搬運到另外一容器中
	注意 : transform 不會給目標容器分配內存,因此須要咱們提早分配好內存
	@param beg1 源容器開始迭代器
	@param end1 源容器結束迭代器
	@param beg2 目標容器開始迭代器
	@param _cakkback 回調函數或者函數對象
	@return 返回目標容器迭代器
*/
transform(iterator beg1, iterator end1, iterator beg2, _callbakc)

transform: 與for_each相似,遍歷全部元素,但可對容器的元素進行修改

int increase (int i){ 
    return i+1;  
} 
main()
{
	vector<int> vecIntA;
    vecIntA.push_back(1);
    vecIntA.push_back(3);
	vecIntA.push_back(5);
    vecIntA.push_back(7);
    vecIntA.push_back(9);

    transform(vecIntA.begin(),vecIntA.end(),vecIntA.begin(),increase);   
    //vecIntA : {2,4,6,8,10}
}
相關文章
相關標籤/搜索