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; }