Re: Applying a function to all elements of a container

Discussion in 'C++' started by Michael DOUBEZ, Nov 27, 2008.

  1. (2b|!2b)==? a écrit :
    > I want to be able to apply a function (cumulative sum) to all elements
    > of a container (a std::vector specifically, although it would be useful
    > to be able to do this with other containers too - say std::map)


    You can use the std::acumulate algorithm:
    vector<int> data;
    int result=std::accumulate(data.begin(),data.end(),0);
    //execute result=result+it; on all elements

    You can even provide a custom binary function
    double
    result=std::accumulate(data.begin(),data.end(),1.0,std::multiplies<double>());
    //execute result=functor(result,it); on all elements

    > I remember seing this done quite elegantly somewhere - dont remember if
    > the visitor design pattern was involved ...


    The vistor pattern applies on a collection of polymorphic types.
    It i not the case here.

    > Basically I have a struct that looks like this:
    >
    > template<typename T>
    > struct MyDatedValue
    > {
    > MyDatedValue(DATE d, T val, T cv):date(d), value(val),cum_value(cv)
    > {}
    >
    > ~MyDatedValue(){}
    >
    > DATE date;
    > T value;
    > T cum_value; //cumulative value
    > };
    >
    > I have a vector of such values
    >
    > typedef std::vector<MyDatedValue<double> > DoubleDatedValuesVector;
    >
    >
    > assuming I have the following code:
    >
    >
    > template<typename T>
    > static void Accumulate(const std::vector<MyDatedValue<T>& values);
    >
    > void main(int argc, char* argv[])
    > {
    > DoubleDatedValuesVector values;
    >
    > values.push_back(MyDatedValue<double>("1-Jan-80", 120, 0));
    > values.push_back(MyDatedValue<double>("2-Jan-80", 122, 0));
    > values.push_back(MyDatedValue<double>("3-Jan-80", 127, 0));
    >
    > Accumulate<double>(values)
    > }
    >
    >
    > //A simplistic way of writing Accumulate() would be to iterate through
    > all of the members and add the values - is there a more elegant/generic
    > way of applying a function to STL container members (I think there is ..
    > bind() etc come to mind, but its been a while since I used that part
    > ofthe STL... hope some experienced STL users can refresh my memory ..


    Define the operation T+MyDatedValue<T>:
    T operator(const T&,const MyDatedValue<T>)
    {
    ...
    }

    An you can directly use
    T resule=std::accumulate(begin,end,T());

    If that doesn't fit the semantic of MyDatedValue, define a binary
    functor and pass it to accumulate.

    --
    Michael
    Michael DOUBEZ, Nov 27, 2008
    #1
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Ken Cox [Microsoft MVP]
    Replies:
    1
    Views:
    3,461
    Charlie@CBFC
    May 12, 2004
  2. Wolfgang Lipp
    Replies:
    1
    Views:
    398
    Patrick TJ McPhee
    Jan 30, 2004
  3. Wolfgang Lipp
    Replies:
    0
    Views:
    471
    Wolfgang Lipp
    Jan 28, 2004
  4. Replies:
    4
    Views:
    795
    Daniel T.
    Feb 16, 2006
  5. Hicham Mouline
    Replies:
    1
    Views:
    389
    Kai-Uwe Bux
    Apr 11, 2010
Loading...

Share This Page