Re: remove_if with a mask
On 8 juin, 10:54, Victor Bazarov <v.baza...@comcast.invalid> wrote:
On 6/8/2010 10:16 AM, eLVa wrote:
On 8 juin, 10:09, "Leigh Johnston"<le...@i42.co.uk> wrote:
"Victor Bazarov"<v.baza...@comcast.invalid> wrote in message
news:hulh6q$46f$1@news.eternal-september.org...
On 6/8/2010 9:13 AM, eLVa wrote:
I have a simple problem : you are given a container, let's say a
vector of some objects, and a vector of bool which is to be treated =
as
a mask. You have to remove every element from the container for whic=
h
the mask is true.
basically, two iterators (one over the container and one over the
mask) iterates through their respective containers, removing element=
s
from the first when the second is true. I tried a few solutions, usi=
ng
remove_if but I was not succesful !
Post what you have, post what didn't work, post your explanation on h=
ow
you expected it to work. Otherwise this looks too much like homewo=
rk, and
Ok ! Wait a minute there, it's not an homework, it's a question I'm
trying to resolve.
Sure, I trust your word. Not a homework. Absolutely. And if you
*were* a student, you would definitely admit that it's homework, yes?
That's settled, then.
I'm a student :-) This is not a homework ^^
I thought that it was not wise to keep an iterator into a functor used
in remove_if.
I am not sure how to respond when somebody says that something "isn't
wise". You must be wiser than I am... It's probably wise for you no=
t
to use my advice then. :-)
Not what I was trying to say, pardon my english.
Storing states in a predicate (a reference to an iterator) is
dangerous, that's what I read. I said unwise but meant dangerous.
> I wanted a direction, that's all.
OK. Did you get it? If you did, happy for you. If you didn't, so=
rry.
Better luck next time.
Yeah, I came up with a working solution half an hour later. So yeah,
that's what I call a good direction, an helping hand.
I'm learning C++ the right way, and it's not easy to get it right the
first time, yesterday, functors and predicates were still a mistery to
me ...
So that's what I got :
template<class Z> struct maskChecker {
public:
maskChecker(const vector<bool> &mask) : it(mask.b=
egin()) {}
bool operator()(Z&) const { return *it ++; }
private:
mutable vector<bool>::const_iterator it;
Instead of keeping a mutable iterator by value, I'd probably keep a
reference to an iterator. But, yes, that's the general idea.
};
template<class T> template<class Z>
void Selector<T>::compact(vector<Z> &data, const vector<bool> &ma=
sk) {
if (data.size() != mask.size()) throw UnmatchedSize(data.s=
ize(),
mask.size());
typename vector<Z>::iterator end = remove_if(data.begin(),
data.end(), maskChecker<Z>(mask));
data.erase(end, data.end());
}
That's kinda working, what's your opinion ?
I would do almost exactly the same, except for the iterator (I just
don't like 'mutable' for some reason). If it works, then you're OK, I
think.
[lib.alg.remove/5] says that the complexity is *exactly* (last-first)
applications of the corresponding predicate. If you had a reference to
the mask iterator, you could compare the iterator to mask.end() after
the call to 'remove_if' as well (and even assert on that).
Perfect, that's what I'll use.
Thank you very much :)
[..]
Since you weren't really replying to my post, I only can answer *my*
questions and continue discussion on the points *I* raised.
V
--
I do not respond to top-posted replies, please don't ask