how to reverse find_if?

J

JDT

Hi,

The following find_if works fine to me except that I want the internal
individual comparison performed backward (from m+5, m+4, ..., to m). I
can use reverse() to reverse the array first but that introduces
overhead (a copy of the whole array). It seems that I can use a reverse
iterator but the array m is not a standard STL container such as a
vector. Is it possible? Your help is much appreciated.

float m[6];
float *p = find_if(m, m+6, bind2nd(greater_equal<float>(), 14.5));

Tony
 
R

red floyd

JDT said:
Hi,

The following find_if works fine to me except that I want the internal
individual comparison performed backward (from m+5, m+4, ..., to m). I
can use reverse() to reverse the array first but that introduces
overhead (a copy of the whole array). It seems that I can use a reverse
iterator but the array m is not a standard STL container such as a
vector. Is it possible? Your help is much appreciated.

float m[6];
float *p = find_if(m, m+6, bind2nd(greater_equal<float>(), 14.5));

I think that you can use std::reverse_iterator with a pointer. See 24.1.1

i.e.:

typedef std::reverse_iterator<float *> rfloat_iter;
rfloat_iter p =
std::find_if(rfloat_iter(m+6), rfloat_iter(m),
std::bind2nd(greater_equal<float>(), 14.5));
 
J

JDT

Hi Red,

Thanks for your help. First of all, what do you mean by 24.1.1?
Second, I am testing your code. To check if find_if finds something,
should I use "p == rfloat_iter(m+6)" or "p == rfloat_iter(m)"? Besides,
is the range between m+5 and m-1?

Your code has some compile errors. I appreciate if somebody can show me
what's the correct syntax (because I am not familiar with this regard).
Thanks for any further help.

Tony

red said:
JDT said:
Hi,

The following find_if works fine to me except that I want the internal
individual comparison performed backward (from m+5, m+4, ..., to m).
I can use reverse() to reverse the array first but that introduces
overhead (a copy of the whole array). It seems that I can use a
reverse iterator but the array m is not a standard STL container such
as a vector. Is it possible? Your help is much appreciated.

float m[6];
float *p = find_if(m, m+6, bind2nd(greater_equal<float>(), 14.5));

I think that you can use std::reverse_iterator with a pointer. See 24.1.1

i.e.:

typedef std::reverse_iterator<float *> rfloat_iter;
rfloat_iter p =
std::find_if(rfloat_iter(m+6), rfloat_iter(m),
std::bind2nd(greater_equal<float>(), 14.5));
 
R

red floyd

Thanks for your help. First of all, what do you mean by 24.1.1?

Section 24.1.1 of the ISO C++ Standard (ISO/IEC 14882:2003).
I am testing your code. To check if find_if finds something, should I
use "p == rfloat_iter(m+6)" or "p == rfloat_iter(m)"?
The latter.
Besides, is the range between m+5 and m-1?

Sort of. See 24.1.1 for more details.
Your code has some compile errors. I appreciate if somebody can show me
what's the correct syntax (because I am not familiar with this regard).

I'm not surprised, I wrote it off the top of my head. I'm sure that one
of the other more knowledgeable types here can help you more than me.

Also, as a matter of etiquette, please try not to top-post (posting all
your text above what you're replying to) -- it's frowned on in this
newsgroup. Instead, intersperse your replies with the text you're
referring to (as I did here), or after the text.
 
R

red floyd

red said:
Section 24.1.1 of the ISO C++ Standard (ISO/IEC 14882:2003).

The latter.


Sort of. See 24.1.1 for more details.

You need to #include said:
I'm not surprised, I wrote it off the top of my head. I'm sure that one
of the other more knowledgeable types here can help you more than me.

Also, as a matter of etiquette, please try not to top-post (posting all
your text above what you're replying to) -- it's frowned on in this
newsgroup. Instead, intersperse your replies with the text you're
referring to (as I did here), or after the text.

you might try this:

#include <iterator>
typedef std::reverse_iterator<float *> rfloat_iter;
const rfloat_iter rbegin = rfloat_iter(m+6);
const rfloat_iter rend = rfloat_iter(m);
rfloat_iter p =
std::find_if(rbegin, rend,
std::bind2nd(std::greater_equal<float>(),
14.5));
if (p == r_end)
/* not found */;
 
J

JDT

red said:
you might try this:

#include <iterator>
typedef std::reverse_iterator<float *> rfloat_iter;
const rfloat_iter rbegin = rfloat_iter(m+6);
const rfloat_iter rend = rfloat_iter(m);
rfloat_iter p =
std::find_if(rbegin, rend,
std::bind2nd(std::greater_equal<float>(),
14.5));
if (p == r_end)
/* not found */;

Hi Red,

The compiler doesn't like the following line so the typedef statement fails:
reverse_iterator<float *>

Thanks for your help.

Tony
 
J

Jim Langston

JDT said:
Hi Red,

The compiler doesn't like the following line so the typedef statement
fails:
reverse_iterator<float *>

Thanks for your help.

Tony

I *think*, but am not positive, he meant something like:
std::vector<float*>::reverse_iterator
 
K

Kai-Uwe Bux

Jim said:
I *think*, but am not positive, he meant something like:
std::vector<float*>::reverse_iterator

No, he did not: the whole point is to turn pointers (used as iterators into
a raw array) into reverse_iterators into that same array. There is no
vector in any of this.


To the OP:

The following (which is the code from red floyd) compiles on g++ and Comeau.

#include <iterator>
#include <algorithm>
#include <functional>

typedef std::reverse_iterator<float *> rfloat_iter;

int main ( void ) {
float m[6];
const rfloat_iter rbegin = rfloat_iter(m+6);
const rfloat_iter rend = rfloat_iter(m);
rfloat_iter p =
std::find_if(rbegin, rend,
std::bind2nd(std::greater_equal<float>(),
14.5));
}

If you still can't get the code to compile, please post a short but complete
program that demonstrates the problem.


Best

Kai-Uwe Bux
 
R

red floyd

Kai-Uwe Bux said:
Jim said:
I *think*, but am not positive, he meant something like:
std::vector<float*>::reverse_iterator

No, he did not: the whole point is to turn pointers (used as iterators into
a raw array) into reverse_iterators into that same array. There is no
vector in any of this.


To the OP:

The following (which is the code from red floyd) compiles on g++ and Comeau.

#include <iterator>
#include <algorithm>
#include <functional>

typedef std::reverse_iterator<float *> rfloat_iter;

int main ( void ) {
float m[6];
const rfloat_iter rbegin = rfloat_iter(m+6);
const rfloat_iter rend = rfloat_iter(m);
rfloat_iter p =
std::find_if(rbegin, rend,
std::bind2nd(std::greater_equal<float>(),
14.5));
}

If you still can't get the code to compile, please post a short but complete
program that demonstrates the problem.


Thanks, Kai-Uwe. I suspect the OP's problem is that he didn't put the
std:: in front of the reverse_iterator in the typedef.
 
A

Adrian Hawryluk

Kai-Uwe Bux said:
Jim said:
I *think*, but am not positive, he meant something like:
std::vector<float*>::reverse_iterator

No, he did not: the whole point is to turn pointers (used as iterators into
a raw array) into reverse_iterators into that same array. There is no
vector in any of this.


To the OP:

The following (which is the code from red floyd) compiles on g++ and Comeau.

#include <iterator>
#include <algorithm>
#include <functional>

typedef std::reverse_iterator<float *> rfloat_iter;

int main ( void ) {
float m[6];
const rfloat_iter rbegin = rfloat_iter(m+6);
const rfloat_iter rend = rfloat_iter(m);
rfloat_iter p =
std::find_if(rbegin, rend,
std::bind2nd(std::greater_equal<float>(),
14.5));
}

If you still can't get the code to compile, please post a short but complete
program that demonstrates the problem.


Best

Kai-Uwe Bux

Sorry, but isn't rend supposed to be initialised with rfloat_iter(m-1)?
Otherwise it will not test the element at index 0.


Adrian

--
_____________________________________________________________________
\/Adrian_Hawryluk BSc. - Specialties: UML, OOPD, Real-Time Systems\/
\ My newsgroup writings are licensed under the Creative Commons /
\ Attribution-Noncommercial-Share Alike 3.0 License /
\_____[http://creativecommons.org/licenses/by-nc-sa/3.0/]_____/
\/______[blog:__http://adrians-musings.blogspot.com/]______\/
 

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,770
Messages
2,569,584
Members
45,079
Latest member
ElidaWarin

Latest Threads

Top