There's no move_if algorithm so i wrote one.
What's your opinion of it (improvements, bugs, etc...) ?
template <typename FwdIt, typename Container, typename Predicate>
inline FwdIt move_if(FwdIt first, FwdIt last, Container &cont, Predicate pred)
{
if (first == last)
return last; // Empty so nothing to move
const size_t size = count_if(first, last, pred);
if (size == 0)
return last; // Nothing to move
cont.resize(size);
FwdIt new_end = first;
auto c = cont.begin();
for (auto i = first; i != last; ++i)
{
if (pred(*i)) // Should it move it ?
*c++ = move(*i);
else
*new_end++ = move(*i);
}
return new_end;
}How you use it:
int main()
{
vector<int> v(10);
generate(v.begin(), v.end(), [] () -> int {
static size_t i = 1;
return i++ * 11;
});
vector<int> n;
auto new_end = move_if(v.begin(), v.end(), n, [](int i){return (i % 2)==0;});
v.erase(new_end, v.end());
auto print_vec_int = [](vector<int> v) {
cout << "[" << v.size() << "]";
for_each(v.cbegin(), v.cend(), [](const int &i) {
cout << " " << i;
});
cout << endl;
};
print_vec_int(v);
print_vec_int(n);
}
/* Output:
[5] 11 33 55 77 99
[5] 22 44 66 88 110
*/
Thread Closed
This thread is kinda stale and has been closed but if you'd like to continue the conversation, please create a new thread in our Forums,
or Contact Us and let us know.