Re: remove_if with a mask
On 8 juin, 12:55, "Leigh Johnston" <le...@i42.co.uk> wrote:
"eLVa" <elvadr...@gmail.com> wrote in message
news:7e9e2a4e-12d7-40b6-b5b8-f256f2d5ced9@s9g2000yqd.googlegroups.com...
On 8 juin, 12:32, "Leigh Johnston" <le...@i42.co.uk> wrote:
"eLVa" <elvadr...@gmail.com> wrote in message
news:30423859-3460-442a-b6c1-60be74e899bd@a30g2000yqn.googlegroups.com.=
...
On 8 juin, 11:46, "Leigh Johnston" <le...@i42.co.uk> wrote:
"eLVa" <elvadr...@gmail.com> wrote in message
news:a2bfe5f8-9f05-4673-8b76-d04133be51a4@z8g2000yqz.googlegroups.co=
m...
This does not compile ...
I know this is about it being initialized by a temporary variable
returned by mask.begin() ..
Should I directly pass a reference to the iterator to the
constructor
of maskChecker rather than the vector itself ?
Yes, assign the result of begin() to a variable and pass the variab=
le
to
the
constructor (by reference). However I mentioned else-thread that
using a
reference wrapper is probably a superior solution.
std::tr1::ref(predicate).
/Leigh
I can't seem to find your post. I tried with a std::tr1::ref(pred) b=
ut
it does not compile, complaining about no class template named
'result' in my predicate struct.
Derive your predicate from std::unary_function<Z, bool>
In what would it be superior ??
No need to have a temporary for the reference and predicates are not
copied
about.
Predicates are not copied, so it is only a gain in memory in this
case, right ?
A temporary for the reference is still required, no ? You don't change
the constructor, so the same problem of initialization from .begin()
arises ? Am I right ? not quite sure ..
I got it right with a reference to an iterator, so I'm glad I alread=
y
have something working :-)
If you use a reference wrapper than you just store an iterator in the
predicate (not a reference):
Ok that was the catch !
Thank you Leigh, I think I got it definitely right now :-)
struct predicate : std::unary_function<int, bool>
{
predicate( std::vector<bool>& v) : i(v.begin()=
) {}
bool operator()(int) { return *i++; }
std::vector<bool>::const_iterator i;
};
int main()
{
std::vector<int> v1;
std::vector<bool> v2;
for (int i = 0; i != 10; ++i)
{
v1.push_back(i);
v2.push_back(i % 2 == 0 ? true : true=
);
}
v1.erase(std::remove_if(v1.begin(), v1.end(),
std::tr1::ref(predicate(v2))), v1.end());
std::copy(v1.begin(), v1.end(), std::ostream_iterator<int=
(std::cout, "
"));
}
/Leigh