Problems with for_each and bind1st

A

Alberto

Hello,

while writing a program I ran across the problem of using for_each.
Although I can traverse lists with a for loop, I'd prefer to use STL's
for_each. Here's my faulty code:

#include <iostream>
#include <list>
#include <algorithm>

using namespace std;

void do_calc(int &k,int ii){
k+=ii;
}

class A{
list <int> li;
int k;

public:


A():k(0){
li.push_back(8);
li.push_back(3);

for_each(li.begin(),li.end(),bind1st(do_calc,k));
}
};


At first, do_calc() was a member function, but

for_each(li.begin(),li.end(),mem_fun(&A::do_calc));

didn't work either. Then I made do_calc() a static member function,
but again I had no luck.

What would be the best approach?

Many thanks in advance,
 
C

Clark S. Cox III

Hello,

while writing a program I ran across the problem of using for_each.
Although I can traverse lists with a for loop, I'd prefer to use STL's
for_each. Here's my faulty code:

#include <iostream>
#include <list>
#include <algorithm>

using namespace std;

void do_calc(int &k,int ii){
k+=ii;
}

class A{
list <int> li;
int k;

public:


A():k(0){
li.push_back(8);
li.push_back(3);

for_each(li.begin(),li.end(),bind1st(do_calc,k));
}
};


At first, do_calc() was a member function, but
for_each(li.begin(),li.end(),mem_fun(&A::do_calc));

didn't work either. Then I made do_calc() a static member function,
but again I had no luck.

What would be the best approach?

Many thanks in advance,

A couple of issues:
1) bind1st() takes an *Adaptable* function. You can turn a regular
function into an adaptable one by passing it through ptr_fun().
2) bind1st isn't appropriate here, as it passes a *copy* of the bound
parameter, and references cannot be copied.
3) Why don't you just use accumulate()?

Try this:
//----- begin code ---------
#include <list>
#include <numeric>

using namespace std;

int do_calc(int k,int ii){
return k+ii;
}

class A{
list <int> li;
int k;

public:


A():k(0){
li.push_back(8);
li.push_back(3);

k = accumulate(li.begin(),li.end(), 0, do_calc);
}
};
//----- end code ---------

Or, if your do_calc function really just adds the numbers, you can omit
it altogether:
//----- begin code ---------
#include <list>
#include <numeric>

using namespace std;

class A{
list <int> li;
int k;

public:


A():k(0){
li.push_back(8);
li.push_back(3);

k = accumulate(li.begin(),li.end(), 0);
}
};
//----- end code ---------
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,962
Messages
2,570,134
Members
46,692
Latest member
JenniferTi

Latest Threads

Top