STL/algorithm/for each

Материал из Wiki.crossplatform.ru

(Различия между версиями)
Перейти к: навигация, поиск
Строка 42: Строка 42:
     bool m_bFirst;
     bool m_bFirst;
public:
public:
-
     int m_nMin, m_nMax;
+
     argument_type m_nMin, m_nMax;
public:
public:
     CMinMax(): m_nMin(-1), m_nMax(-1), m_bFirst(true){}
     CMinMax(): m_nMin(-1), m_nMax(-1), m_bFirst(true){}
-
     void operator()(int nElem)
+
     result_type operator()(argument_type nElem)
     {
     {
         if( m_bFirst)  
         if( m_bFirst)  
Строка 77: Строка 77:
The max is 15
The max is 15
The min is 1
The min is 1
 +
</source>
 +
 +
 +
== Нахождение среднего значения с помощью объекта функции  ==
 +
<source lang="cpp"> 
 +
#include <iostream>
 +
#include <vector>
 +
#include <algorithm>
 +
#include <functional>
 +
 +
class CMeanValue : public std::unary_function<int, void>
 +
{
 +
private:
 +
    long m_Num;
 +
    long m_Sum;
 +
public:
 +
    CMeanValue () : m_Num(0), m_Sum(0) {}
 +
    result_type operator()(argument_type elem) { m_Num++; m_Sum += elem; }
 +
    operator double() { return static_cast<double>(m_Sum) / static_cast<double>(m_Num); }
 +
};
 +
 +
int main()
 +
{
 +
    std::vector<int> coll;
 +
    for( int n = 1; n < 16; ++n) coll.push_back( n);
 +
    std::copy( coll.begin(), coll.end(), std::ostream_iterator<int>(std::cout, " ") );
 +
    std::cout << std::endl;
 +
   
 +
    double dMv = for_each (coll.begin(), coll.end(), CMeanValue());
 +
    std::cout << "Mean value is: " << dMv << std::endl;
 +
 +
    return 0;
 +
}
 +
</source>
 +
<source lang="bash">
 +
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
 +
Mean value is: 8
</source>
</source>

Версия 12:28, 24 января 2012

Подсчет суммы с помощью объекта функции

 
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
 
class CSum : std::unary_function<int, void> 
{
public:
    argument_type m_sum;
    CSum() { m_sum = 0; }
    result_type operator()(argument_type i) 
    {
        m_sum += i;
    }
};
int main()
{
    std::vector<int> coll;
    for( int n = 1; n < 16; ++n) coll.push_back( n);
    std::copy( coll.begin(), coll.end(), std::ostream_iterator<int>(std::cout, " ") );
 
    CSum s;
    s = std::for_each( coll.begin(), coll.end(), CSum());
    std::cout << "sum of v: " << s.m_sum << std::endl;
    return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 sum of v: 120

Расширение объекта функции, нахождение минимума и максимума

#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
 
class CMinMax : public std::unary_function<int, void>
{
protected:
    bool m_bFirst;
public:
    argument_type m_nMin, m_nMax;
public:
    CMinMax(): m_nMin(-1), m_nMax(-1), m_bFirst(true){}
    result_type operator()(argument_type nElem)
    {
        if( m_bFirst) 
            m_nMin = m_nMax = nElem;
        else if (nElem < m_nMin) 
            m_nMin = nElem;
        else if (nElem > m_nMax) 
            m_nMax = nElem;
        m_bFirst = false;
    }
};
 
int main()
{
    std::vector<int> coll;
    for( int n = 1; n < 16; ++n) coll.push_back( n);
    std::copy( coll.begin(), coll.end(), std::ostream_iterator<int>(std::cout, " ") );
    std::cout << std::endl;
 
    CMinMax mm;
    mm = for_each( coll.begin(), coll.end(), mm);
    std::cout << "The max is " << mm.m_nMax << std::endl;
    std::cout << "The min is " << mm.m_nMin << std::endl;
 
    return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
The max is 15
The min is 1


Нахождение среднего значения с помощью объекта функции

 
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
 
class CMeanValue : public std::unary_function<int, void>
{
private:
    long m_Num;
    long m_Sum;
public:
    CMeanValue () : m_Num(0), m_Sum(0) {}
    result_type operator()(argument_type elem) { m_Num++; m_Sum += elem; }
    operator double() { return static_cast<double>(m_Sum) / static_cast<double>(m_Num); }
};
 
int main()
{
    std::vector<int> coll;
    for( int n = 1; n < 16; ++n) coll.push_back( n);
    std::copy( coll.begin(), coll.end(), std::ostream_iterator<int>(std::cout, " ") );
    std::cout << std::endl;
 
    double dMv = for_each (coll.begin(), coll.end(), CMeanValue());
    std::cout << "Mean value is: " << dMv << std::endl;
 
    return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Mean value is: 8