Why doesn't this program work as expected?

A

Alex Buell

#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

template <typename T>
class LessThan
{
private:
T comp;
public:
LessThan(T val) : comp(val) {}
void setComp(const T& val) { comp = val; }
T getComp(void) { return comp; } const
bool operator()(const T& value) { return value < comp; }
};

int main()
{
double darr[10] = { 234.4, 11.1, 22.2, 500.0, 50.0, 11.1, 12.1,
600.6, 99.9, 0.0 }; vector<double> v2(darr, darr + 10);

double dal = 100.0;
LessThan<double> lt2(dal);

int count1 = count_if(v2.begin(), v2.begin(), lt2);
cout << "There are " << count1 << " values less than " << dal
<< endl;

return 0;
}

Expected output should have been "There are 7 values less than 100",
but it actually comes up with: "There are 0 values less than 100". Why?

I'm using GCC 3.4.4 on Linux

Thanks
 
M

Mark P

Ready to kick yourself?

Alex said:
#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

template <typename T>
class LessThan
{
private:
T comp;
public:
LessThan(T val) : comp(val) {}
void setComp(const T& val) { comp = val; }
T getComp(void) { return comp; } const
bool operator()(const T& value) { return value < comp; }
};

int main()
{
double darr[10] = { 234.4, 11.1, 22.2, 500.0, 50.0, 11.1, 12.1,
600.6, 99.9, 0.0 }; vector<double> v2(darr, darr + 10);

double dal = 100.0;
LessThan<double> lt2(dal);

int count1 = count_if(v2.begin(), v2.begin(), lt2);

Hmm, begin() to begin()... :)

-Mark
 
A

Alf P. Steinbach

* Alex Buell:
#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

template <typename T>
class LessThan

Are you aware that the standard library provides std::less and
std::bind2nd, which together gives you this functionality?
{
private:
T comp;
public:
LessThan(T val) : comp(val) {}
void setComp(const T& val) { comp = val; }
T getComp(void) { return comp; } const

Note that that 'const' actually applies to the 'bool' on the line
below... 'getComp' should be declared as 'const'. Also, 'comp' would
IMO be a better name (I don't like 'computeSin' & friends...), and even
better, som other name than 'comp', e.g. just 'value'.
bool operator()(const T& value) { return value < comp; }

Should ideally be declared as 'const'.
};


int main()
{
double darr[10] = { 234.4, 11.1, 22.2, 500.0, 50.0, 11.1, 12.1,
600.6, 99.9, 0.0 }; vector<double> v2(darr, darr + 10);

The array 'darr' should ideally be declared 'const'.

Ditto for the vector 'v2', unless you plan on modifying the values.

double dal = 100.0;
LessThan<double> lt2(dal);

int count1 = count_if(v2.begin(), v2.begin(), lt2);
cout << "There are " << count1 << " values less than " << dal
<< endl;

return 0;
}

Expected output should have been "There are 7 values less than 100",
but it actually comes up with: "There are 0 values less than 100". Why?

Perhaps you meant to use begin() and end() instead of begin() and begin()?
 
A

Alex Buell

int main()
{
double darr[10] = { 234.4, 11.1, 22.2, 500.0, 50.0, 11.1, 12.1,
600.6, 99.9, 0.0 }; vector<double> v2(darr, darr + 10);

The array 'darr' should ideally be declared 'const'.

Ditto for the vector 'v2', unless you plan on modifying the values.

Is there a good reason to declare them as const? Would it result in
better optimisations?
 
A

Alf P. Steinbach

* Alex Buell:
int main()
{
double darr[10] = { 234.4, 11.1, 22.2, 500.0, 50.0, 11.1, 12.1,
600.6, 99.9, 0.0 }; vector<double> v2(darr, darr + 10);
The array 'darr' should ideally be declared 'const'.

Ditto for the vector 'v2', unless you plan on modifying the values.

Is there a good reason to declare them as const?
Yes.


Would it result in better optimisations?

Probably not.

The habit of declaring things 'const', whenever possible, results in a
much better chance of a correct program.

If the program doesn't need to be correct you can make it arbitrarily
fast... ;-)
 
A

Alex Buell

Probably not.

The habit of declaring things 'const', whenever possible, results in a
much better chance of a correct program.

In case someone else comes along and tries to modify the values, no
doubt, yes?
If the program doesn't need to be correct you can make it arbitrarily
fast... ;-)

lol, that's true.
 

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

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top