Login or Sign up Help | Site Map
Connecting Tech Pros Worldwide

About for_each usage

Question posted by: fgh.vbn.rty@gmail.com (Guest) on July 2nd, 2008 10:35 PM
I'm having problems setting up the functors to use for_each. Here's an
example:

class A {
public:
void getName() { return name; }
private:
string name;
};

class B {
public:
vector<intgetIds { return vi; }
A& getA(int idx) { return vA.at(idx); }
void bfunc();
private:
vector<AvA;
vector<intvi;
}

class C {
public:
void cfunc();
private:
B b;
}

void B::bfunc()
{
// populate vi
for(int i=0; i<vi.size(); ++i) {
cout << vA[i].printName() << endl;
}
}

void C::cfunc()
{
// populate vi
vector<intvc = b.getIds();
for(int i=0; i<vc.size(); ++i) {
A& a = getA(vc[i]);
cout << a.getName() << endl;
}
}

Here vA is just a vector of As and vi is a vector of integers that
index into vA. Let's suppose that vA and vi are populated
appropriately. All I'm trying to do is to execute a particular
function on a subset of the As.

I have three questions:
1) How do I replace the for loop in bfunc with a for_each?
2) How do I replace the for loop in cfunc with a for_each?
3) How would I do this using the Boost.Lambda functions?

Thanks.
Would you like to answer this question?
Sign up for a free account, or Login (if you're already a member).
Ivan Novick's Avatar
Ivan Novick
Guest
n/a Posts
July 2nd, 2008
11:55 PM
#2

Re: About for_each usage
On Jul 2, 3:27*pm, fgh.vbn....@gmail.com wrote:
Quote:
Originally Posted by
I'm having problems setting up the functors to use for_each. Here's an
example:
>
class A {
public:
* * void getName() { return name; }
private:
* * string name;
>
};
>
class B {
public:
* * *vector<intgetIds { return vi; }
* * *A& getA(int idx) { return vA.at(idx); }
* * *void bfunc();
private:
* * *vector<AvA;
* * *vector<intvi;
>
}
>
class C {
public:
* * *void cfunc();
private:
* * *B b;
>
}
>
void B::bfunc()
{
* *// populate vi
* *for(int i=0; i<vi.size(); ++i) {
* * * * cout << vA[i].printName() << endl;
* *}
>
}
>
void C::cfunc()
{
* *// populate vi
* *vector<intvc = b.getIds();
* *for(int i=0; i<vc.size(); ++i) {
* * * * A& a = getA(vc[i]);
* * * * cout << a.getName() << endl;
* *}
>
}
>
Here vA is just a vector of As and vi is a vector of integers that
index into vA. Let's suppose that vA and vi are populated
appropriately. All I'm trying to do is to execute a particular
function on a subset of the As.
>
I have three questions:
1) How do I replace the for loop in bfunc with a for_each?
2) How do I replace the for loop in cfunc with a for_each?
3) How would I do this using the Boost.Lambda functions?
>
Thanks.


Hi,

Your code has too many syntax errors as is to give advice on how to
modify it. Can you first make it compile and then repost it.

Ivan Novick
http://www.mycppquiz.com

fgh.vbn.rty@gmail.com's Avatar
fgh.vbn.rty@gmail.com
Guest
n/a Posts
July 3rd, 2008
12:25 AM
#3

Re: About for_each usage


Ivan Novick wrote:
Quote:
Originally Posted by
On Jul 2, 3:27�pm, fgh.vbn....@gmail.com wrote:
Quote:
Originally Posted by
I'm having problems setting up the functors to use for_each. Here's an
example:

class A {
public:
� � void getName() { return name; }
private:
� � string name;

};

class B {
public:
� � �vector<intgetIds { return vi; }
� � �A& getA(int idx) { return vA.at(idx); }
� � �void bfunc();
private:
� � �vector<AvA;
� � �vector<intvi;

}

class C {
public:
� � �void cfunc();
private:
� � �B b;

}

void B::bfunc()
{
� �// populate vi
� �for(int i=0; i<vi.size(); ++i) {
� � � � cout << vA[i].printName() << endl;
� �}

}

void C::cfunc()
{
� �// populate vi
� �vector<intvc = b.getIds();
� �for(int i=0; i<vc.size(); ++i) {
� � � � A& a = getA(vc[i]);
� � � � cout << a.getName() << endl;
� �}

}

Here vA is just a vector of As and vi is a vector of integers that
index into vA. Let's suppose that vA and vi are populated
appropriately. All I'm trying to do is to execute a particular
function on a subset of the As.

I have three questions:
1) How do I replace the for loop in bfunc with a for_each?
2) How do I replace the for loop in cfunc with a for_each?
3) How would I do this using the Boost.Lambda functions?

Thanks.

>
Hi,
>
Your code has too many syntax errors as is to give advice on how to
modify it. Can you first make it compile and then repost it.
>
Ivan Novick
http://www.mycppquiz.com


Sorry, I should've tried it out first. Anyway, the following compiles
without errors on gcc v3.0.4.

#include <iostream>
#include <string>
#include <vector>

using namespace std;

class A {
public:
std::string getName() { return name; }
private:
std::string name;
};

class B {
public:
vector<intgetIds() { return vi; }
A& getA(int idx) { return vA.at(idx); }
void bfunc();
private:
vector<AvA;
vector<intvi;

};

class C {
public:
void cfunc();
private:
B b;
};

void B::bfunc()
{
// populate vA and vi in some fashion
for(int i=0; i<vi.size(); ++i) {
std::cout << vA[i].getName() << std::endl;
}
}

void C::cfunc()
{
// populate vA and vi in some fashion
vector<intvc = b.getIds();
for(int i=0; i<vc.size(); ++i) {
A& a = b.getA(vc[i]);
std::cout << a.getName() << std::endl;
}
}

Daniel T.'s Avatar
Daniel T.
Guest
n/a Posts
July 3rd, 2008
01:55 AM
#4

Re: About for_each usage
Join Bytes! wrote:
Quote:
Originally Posted by
I'm having problems setting up the functors to use for_each. Here's an
example:
>
class A {
public:
void getName() { return name; }


error: return-statement with a value, in function returning 'void'
Quote:
Originally Posted by
private:
string name;
};
>
class B {
public:
vector<intgetIds { return vi; }


error: invalid member function declaration
Quote:
Originally Posted by
A& getA(int idx) { return vA.at(idx); }
void bfunc();
private:
vector<AvA;
vector<intvi;
}


error: missing semi-colon
Quote:
Originally Posted by
class C {
public:
void cfunc();
private:
B b;
}


error: missing semi-colon
Quote:
Originally Posted by
void B::bfunc()
{
// populate vi
for(int i=0; i<vi.size(); ++i) {
cout << vA[i].printName() << endl;


error: 'class A' has no member named 'printName'
Quote:
Originally Posted by
}
}
>
void C::cfunc()
{
// populate vi
vector<intvc = b.getIds();
for(int i=0; i<vc.size(); ++i) {
A& a = getA(vc[i]);


error: 'getA' was not declared in this scope
Quote:
Originally Posted by
cout << a.getName() << endl;
}
}
>
Here vA is just a vector of As and vi is a vector of integers that
index into vA.


Frankly, there a so many errors, that I don't think the loops do what
you want them to do, especially bfunc.
Quote:
Originally Posted by
Let's suppose that vA and vi are populated
appropriately. All I'm trying to do is to execute a particular
function on a subset of the As.
>
I have three questions:
1) How do I replace the for loop in bfunc with a for_each?


Don't use for_each, use transform instead:

transform(vA.begin(), vA.begin() + vi.size(),
ostream_iterator<string>(cout, "\n"), mem_fun_ref(&A::getName));

But again, I don't think that's what you want.
Quote:
Originally Posted by
2) How do I replace the for loop in cfunc with a for_each?


That function really should be in class B. It pulls B's vi variable out,
and then iterates over B's vA variable. So let's put it there instead:

string B::getNameOf(int x)
{
return vA.at(x).getName();
}

void B::cfunc()
{
transform(vi.begin(), vi.end(), ostream_iterator<string>(cout, "\n"),
bind1st(mem_fun(&B::getNameOf), this));
}

Quote:
Originally Posted by
3) How would I do this using the Boost.Lambda functions?


Differently.

 
Not the answer you were looking for? Post your question . . .
183,967 Experts ready to help you find a solution.
Sign up for a free account, or Login (if you're already a member).

Latest Articles: Read & Comment
  • Didn't find the answer you were looking for?
    Post Your Question
  • Top Community Contributors