STL だけで Perl の grep

sequence_container ( http://www.cplusplus.com/reference/stl/ の表参照 ) を出力先とすると下の code が多分素直な書き方。

sequence_container.resize(std::count_if(src.begin(), src.end(), pred));
std::remove_copy_if(
    src.begin(), src.end(), sequence_container.begin(),
    std::not1(std::ptr_fun(pred)));

で、これを踏まえた以下の code は一応動く。うーむやはり std::copy_if() がないのがアレだなぁ。

#include <algorithm>
#include <cstring>
#include <functional>
#include <iostream>
#include <iterator>
#include <string>
#include <vector>

bool length_is_even(const char* const str) {
    return (std::strlen(str) % 2 == 0);
}

int main(const int argc, const char* const argv[]) {
    // dst
    std::vector<std::string> ss;

    // grep
    ss.resize(std::count_if(argv, argv + argc, length_is_even));
    std::remove_copy_if(
        argv, argv + argc, ss.begin(),
        std::not1(std::ptr_fun(length_is_even)));

    // print
    std::copy(
        ss.begin(), ss.end(),
        std::ostream_iterator<std::string>(std::cout, "\n"));
    std::cout << ss.size() << std::endl;

    return 0;
}