泛函数
find:
find_end://查找最后一个出现的元素
find_if:
下面主要讲一下 find_if
template<class _InIt,class _Pr> inline
_InIt _Find_if(_InIt _First, _InIt _Last, _Pr _Pred)
{ // find first satisfying _Pred
for (; _First != _Last; ++_First)
if (_Pred(*_First))
break;
return (_First);
}
可以看出pred这个参数可以是一个函数,也可以是一个类的bool operator()函数
ex1:
class CTest
{
public:
bool operator()(int a)
{
return a == 2? true: false;
}
};
void main()
{
std::vector<int> vecTest;
vecTest.push_back(1);
vecTest.push_back(2);
vecTest.push_back(2);
vecTest.push_back(3);
std::remove_if(vecTest.begin(), vecTest.end(),CTest());
}
ex2://使用lambda表达式
std::vector<int>::iterator reIter ;
reIter = std::find_if(vecTest.begin(), vecTest.end(),
[](int i)->bool
{
return i == 2? true: false;
});
remove和remove_if的作用:
remove只是移动元素,而且会移动所有满足所有条件的元素,不能做真正的删除。
它的返回值是 指向未移去的最后一个元素的下一个位置。
如果要真正的删除元素:
list应该用list::remove
其它容器应该用erase
ex:
一个数组:
int arrTest[] = {1,2,3,3,3,4,5,0};
//在remove之后的值是:arrTest[] = {1,2,4,5,3,4,5,0}
//remove的返回值是&arrTest[4],可以看出arrTest[4]=3
//注意:这里的数组必须有一个末尾位置,末尾位置作为一个标志,需要被访问,但是不会被修改。
//就像 vector::end()的返回值一样。
std::remove(arrTest,arrTest + (sizeof arrTest)/sizeof(int) -1, 3);
ex: remove函数之后调用 list::remove(其它容器则调用remove)才能真正删除
std::vector<int> vecTest;
vecTest.push_back(1);
vecTest.push_back(2);
vecTest.push_back(2);
vecTest.push_back(3);
std::vector<int>::iterator reIter = std::remove(vecTest.begin(), vecTest.end(),2);
vecTest.erase(reIter,vecTest.end());
count和 count_if:利用等于操作符,把标志范围类的元素与输入的值进行比较,并返回相等元素的个数。
ex:
std::vector<int> vecTest;
vecTest.push_back(1);
vecTest.push_back(2);
vecTest.push_back(2);
vecTest.push_back(3);
//最后a=2
int a = std::count_if(vecTest.begin(), vecTest.end(),
[](int i)->bool
{
return i == 2? true:false;
});
for_each:依次对范围内的所有元素执行输入的函数。
看下面的代码就知道,对每个元素做一个动作。这个函数很有用,可以不用写for循环了
template<class _InIt, class _Fn1> inline
_Fn1 _For_each(_InIt _First, _InIt _Last, _Fn1 _Func)
{ // perform function for each element
for (; _First != _Last; ++_First)
_Func(*_First);
return (_Func);
}
ex:
std::vector<int> vecTest;
vecTest.push_back(1);
vecTest.push_back(2);
vecTest.push_back(2);
vecTest.push_back(3);
std::for_each(vecTest.begin(),vecTest.end(),
[](int i)
{
cout<<i<<endl;
}
);
generate和 generate_n:通过对输入的函数gen的连续调用来填充指定的范围。
generate函数对产生随机数非常有利.
template<class _OutIt, class _Diff, class _Fn0> inline
void _Generate_n(_OutIt _Dest, _Diff _Count, _Fn0 _Func)
{ // replace [_Dest, _Dest + _Count) with _Func()
for (; 0 < _Count; --_Count, ++_Dest)
*_Dest = _Func();
}
ex:
std::vector<int> vecTest;
vecTest.resize(30);//初始化就让它有30个元素
std::generate(vecTest.begin(), vecTest.end(),
[]()->int
{
int a = rand() * 10;
cout << a<<endl;
return a;
});
less算子和greater