I should explain what's wrong with your move_if():

1. It requires forward iterators. copy_if() accepts input iterators.

2. It writes into a container. copy_if() writes into an iterator, which is more general.

3. It performs two passes, applying the predicate 2N times. copy_if() performs a single pass.

4. It's not actually imitating copy_if(). It's imitating partition_copy(), which splits a source range into two output ranges (but not exactly, as partition_copy() prohibits input overlapping output).