On 08/27/2012 12:46 PM, Ellery Newcomer wrote:
On 08/24/2012 12:23 PM, JN wrote:
I feel kinda stupid here, what's wrong with C++ remove_if (
http://www.cplusplus.com/reference/algorithm/remove_if/ )?


you mean something like

c.erase(remove_if(c.begin(), c.end(), predicate), c.end())

?

That actually is the sort of thing one could accomplish with position
ranges:

c.remove(filter!(anti_predicate)(c.position_range()));

Doh.

import std.stdio;
import std.container;

void main(){
    auto sl = SList!int([1,2,3,4,5,6,7,8]);
    auto rng = sl[];
    writeln(sl[]);
    sl.linearRemove(remove_if!"a % 2 == 1"(sl[]));
    writeln(sl[]);
}

auto remove_if(alias _pred, Rng)(Rng rng) {
    import std.functional;
    alias unaryFun!_pred pred;
    Rng res = rng.save();
    while(!rng.empty) {
        if(!pred(rng.front)) {
            res.front = rng.moveFront();
            res.popFront();
        }
        rng.popFront();
    }
    return res;
}


Hmm. In multi_index,

 res.front = rng.moveFront();

has some slightly nasty ramifications which I am not sure how to get around (without access to the node pointer of the element being assigned, multi_index has to remove the element and then add it back in). I wonder what boost::multi_index does?

Reply via email to