Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   Question on usage of functional object. (http://www.velocityreviews.com/forums/t459987-question-on-usage-of-functional-object.html)

 hn.ft.pris@gmail.com 01-23-2007 06:51 AM

Question on usage of functional object.

I've got following code test C++'s functor. For the sake of

#include <algorithm>
#include <functional>

using namespace std;

template <typename T> class Sum{
public:
Sum(T i=0):sum(i){};
inline void operator () (T x){
sum += x;
}
inline T output() const{
return sum;
}

private:
T sum;
};

int main( void ){

vector<int> vec(10, 1);

Sum<int> sum;

sum = for_each(vec.begin(), vec.end(), Sum<int>()); .......(1)
sum = for_each(vec.begin(), vec.end(), sum); .........(2)
sum = for_each(vec.begin(), vec.end(), sum.operator()(int) ); ...(3)

cout << sum.output() << endl;

return 1;
}

It's easy to understand that (2) works, because sum.operator()(int) is
called implicitly. (1) also works, it confuses me. Does Sum<int>()
create an implicit class Sum object? On the other hand, Sum<int>
doesn't work.
(3) fails, does it means the third argument of "for_each" couldn't be a
function pointer? What will the code be if I want to pass a function
pointer here? Thanks for help!

 Kai-Uwe Bux 01-23-2007 11:52 AM

Re: Question on usage of functional object.

hn.ft.pris@gmail.com wrote:

> I've got following code test C++'s functor. For the sake of
> easy-reading, I omit some declearations.
>
>
>
> #include <algorithm>
> #include <functional>
>
> using namespace std;
>
> template <typename T> class Sum{
> public:
> Sum(T i=0):sum(i){};
> inline void operator () (T x){
> sum += x;
> }
> inline T output() const{
> return sum;
> }
>
> private:
> T sum;
> };
>
> int main( void ){
>
>
> vector<int> vec(10, 1);
>
> Sum<int> sum;
>
> sum = for_each(vec.begin(), vec.end(), Sum<int>()); .......(1)
> sum = for_each(vec.begin(), vec.end(), sum); .........(2)
> sum = for_each(vec.begin(), vec.end(), sum.operator()(int) ); ...(3)
>
> cout << sum.output() << endl;
>
> return 1;
> }
>
> It's easy to understand that (2) works, because sum.operator()(int) is
> called implicitly. (1) also works, it confuses me. Does Sum<int>()
> create an implicit class Sum object?

There is nothing implicit about the function object. Although: it is a
temporary.

> On the other hand, Sum<int> doesn't work.

Right: Sum<int> just denotes a type. It is not an expression that evaluates
to an object of that type.

> (3) fails, does it means the third argument of "for_each" couldn't be a
> function pointer?

No, it just means you got the syntax wrong.

> What will the code be if I want to pass a function pointer here?

Well, just pass a function pointer. Something like:

void inc_5 ( int & a ) { a+=5; }

....

for_each( vec.begin(), vec.end(), &inc_5 );

(warning, I just typed it into the newsreader, so there may be typos in the
code.)

Best

Kai-Uwe Bux

 Tushar Saxena 01-23-2007 12:25 PM

Declaring a dynamic 2D array on the heap

Hello everyone,

I'd really appreciate it if anyone could describe some of the nuances
of declaring and using a dynamic 2D array on the heap.

Thanx
<tuShaRsAXEna>

 =?iso-8859-1?q?Erik_Wikstr=F6m?= 01-23-2007 12:34 PM

Re: Declaring a dynamic 2D array on the heap

On Jan 23, 1:25 pm, Tushar Saxena <tsax...@cse.buffalo.edu> wrote:
> Hello everyone,

Hi, try to start a new topic next time and don't hijack an existing
one.

> I'd really appreciate it if anyone could describe some of the nuances
> of declaring and using a dynamic 2D array on the heap.

T* arr = new T[nr];

Replace T with the type you want an array of and nr with the number of
elements in the array.

arr[n]

Access element n of the array.

delete[] arr;

Delete the array when you are done with it.

Can't think of much more to say about it except that it might be better

std::vector<T> arr = new std::vector<T>();
delete arr;

The rest is the same.

--
Erik Wikström

 All times are GMT. The time now is 08:58 AM.