您可以轻松地创建一个every_n
谓词并使用它来根据需要过滤 copy_if 等。这是您可以获得的通用性。
“每 n 个元素”谓词的近似(注意:尚未测试)示例:
/**
@brief Un predicado que retorna @c true cada @a n invocaciones.
**/
template <typename Integer>
struct every_n {
static_assert (std::numeric_limits<Integer>::is_integer, "Must behave like an integer");
public:
explicit every_n (Integer const& e)
: n(e), x(1) {}
every_n (every_n const& E)
: n(E.n), x(E.x) {}
bool operator () (...) {
if (x<n) { ++x; return false; }
else { x=Integer(1); return true; }
}
private:
Integer x;
const Integer n;
};
// "make_" idiom
template <typename Integer>
every_n<Integer> every (Integer const& c) { return every_n<Integer>(c); }
// sample usage
# include required headers, etc
using namespace std;
const int a_size = 6, b_size = 3;
int a[a_size] = {1, 3, 6, 3, 2, 7};
int b[b_size];
copy_if (begin(a), end(a), begin(b), every(3));
所需要的所有代码都是every()
使用行为类似于整数的类型调用的。
(代码使用 static_assert、begin()、end() 和 copy_if(),它们是 C++11,但如果你像我一样向后移植足够的函数,那么在 C++03 中的功能也一样)