天天看點

STL算法---查找算法(二)

3. count(統計)

使用等于操作符,把在[_First, _Last)範圍内的元素與輸入值_Val比較,傳回相等元素個數

size_t count(_InIt _First, _InIt _Last, const _Ty& _Val);

//
#include "stdafx.h"
#include <algorithm>
#include <numeric>
#include <functional>
#include <vector>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
	std::vector<int> nV;
	std::vector<int>::iterator iter;
	std::vector<int>::iterator iterBegin;
	std::vector<int>::iterator iterEnd;

	nV.push_back(1);
	nV.push_back(4);
	nV.push_back(5);
	nV.push_back(1);
	nV.push_back(1);
	iterBegin = nV.begin();
	iterEnd = nV.end();

	int nVal1 = 6; 
	int nVal2 = 1; 
	// 輸出0:3
	std::cout << std::count(iterBegin, iterEnd, nVal1) << ":" 
		<< std::count(iterBegin, iterEnd, nVal2) << std::endl;
	return 0;
}
//
           

4. count_if(統計)

使用輸入的操作符pr, 把在[_First, _Last)範圍内的元素與輸入值_Val比較,傳回相等元素個數

size_t count_if(InIt first, InIt last, Pred pr);

//
#include "stdafx.h"
#include <algorithm>
#include <numeric>
#include <functional>
#include <vector>
#include <iostream>

bool greater8(int value)
{
    return value > 8;
}

class MyObject 
{  
public:
	MyObject(int nVal):m_nVal(nVal){}
	~MyObject(){}
	int m_nVal;
	// 括号操作符
    bool operator()(int val1)  
    {  
        return val1 > m_nVal;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
	std::vector<int> nV;
	std::vector<int>::iterator iter;
	std::vector<int>::iterator iterBegin;
	std::vector<int>::iterator iterEnd;

	nV.push_back(11);
	nV.push_back(4);
	nV.push_back(5);
	nV.push_back(1);
	nV.push_back(10);
	iterBegin = nV.begin();
	iterEnd = nV.end();

	int nVal1 = 6; 
	int nVal2 = 1; 
	// 輸出2:2
	std::cout << std::count_if(iterBegin, iterEnd, greater8) << ":"				// 回調函數也可以
		<< std::count_if(iterBegin, iterEnd, MyObject(8)) << std::endl;			// 函數對象也可以

	return 0;
}
//
           

5. equal_range(也是使用二分查找的算法)

函數原形

template<class FwdIt, class T> pair<FwdIt, FwdIt> equal_range(FwdIt first, FwdIt last,const T& val);

template<class FwdIt, class T, class Pred> pair<FwdIt, FwdIt> equal_range(FwdIt first, FwdIt last,const T& val, Pred pr);

equal_range是STL中的一種二分查找的算法, 對已排序的[first, last)中尋找value, 它傳回一對疊代器

(比較器使用"<"操作符).

/
#include "stdafx.h"
#include <algorithm>
#include <numeric>
#include <functional>
#include <vector>
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
	std::vector<int> nV;
	std::vector<int>::iterator iter;
	std::vector<int>::iterator iterBegin;
	std::vector<int>::iterator iterEnd;
	std::pair<std::vector<int>::iterator, std::vector<int>::iterator> pairResult;

	// 升序
	nV.clear();
	nV.push_back(11);
	nV.push_back(13);
	nV.push_back(14);
	nV.push_back(14);
	nV.push_back(14);
	nV.push_back(14);
	nV.push_back(14);
	nV.push_back(16);
	nV.push_back(16);
	nV.push_back(16);
	nV.push_back(18);
	nV.push_back(18);
	nV.push_back(18);
	nV.push_back(18);
	nV.push_back(18);
	nV.push_back(19);

	iterBegin = nV.begin();
	iterEnd = nV.end();

	int nVal = 6;
	// 看輸出結果: (*(pairResult.first), *(pairResult.second))
	pairResult = std::equal_range(iterBegin, iterEnd, 10);	// (11, 11)
	pairResult = std::equal_range(iterBegin, iterEnd, 11);	// (11, 13)
	pairResult = std::equal_range(iterBegin, iterEnd, 12);	// (13, 13)
	pairResult = std::equal_range(iterBegin, iterEnd, 13);	// (13, 14)
	pairResult = std::equal_range(iterBegin, iterEnd, 14);	// (14, 16)
	pairResult = std::equal_range(iterBegin, iterEnd, 15);	// (16, 16)
	pairResult = std::equal_range(iterBegin, iterEnd, 16);	// (16, 18)
	pairResult = std::equal_range(iterBegin, iterEnd, 17);	// (18, 18)
	pairResult = std::equal_range(iterBegin, iterEnd, 18);	// (18, 19)
	pairResult = std::equal_range(iterBegin, iterEnd, 19);	// (19, end)
	pairResult = std::equal_range(iterBegin, iterEnd, 20);	// (end, end)
	
	return 0;
}
           

注意:

1. 這裡也是使用"二分查找". 是以,

2. 容器中資料是升序排列.

3. 比較器使用"<"操作符.