泛函数、lest,greater算子

 

泛函数

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值