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. 比較器使用"<"操作符.