c++ - 如何实现类似 std::copy_if 但在插入不同容器之前应用函数
问题描述
完全公开,这可能是一个锤子和钉子的情况,在不需要时尝试使用 STL 算法。我在我正在使用的一些 C++14 代码中看到了一种重新出现的模式。我们有一个迭代的容器,如果当前元素匹配某个条件,那么我们将其中一个元素字段复制到另一个容器。
模式类似于:
for (auto it = std::begin(foo); it!=std::end(foo); ++it){
auto x = it->Some_member;
// Note, the check usually uses the field would add to the new container.
if(f(x) && g(x)){
bar.emplace_back(x);
}
}
这个想法几乎是一种累积,所应用的函数并不总是返回一个值。我只能想到一个解决方案
- 需要一个函数来访问您想要累积的成员和另一个函数来检查条件。即如何结合std::copy_if 和std::transform?
- 比我要更换的东西更糟。
这甚至是个好主意吗?
解决方案
当然。有很多方法。
找一个图书馆
transform_if
,比如boost
.找到一个带有 的库
transform_range
,它接受一个转换和范围或容器,并返回一个具有转换值的范围。用copy_if
.找到一个
filter_range
像上面这样的库。现在,std::transform
与您的过滤范围一起使用。找到两者兼而有之的,并以适当的顺序组合过滤和转换。现在您的问题只是复制(
std::copy
或其他)。编写您自己的反向插入器包装器,在插入时进行转换。将其与
std::copy_if
.编写您自己的范围适配器,例如 2 3 和/或 4。
写
transform_if
。
推荐阅读
- microsoft-graph-api - 如何在数组对象上构建 Ms graph api 查询过滤器?
- excel - Excel 数据行合并
- python - 计算 24 小时时间以确定开店/关店
- r - 如何减小回归对象的大小适合保存到.rds时大小爆炸的函数
- python - 按组从 agg 函数创建新列
- python - 无法从任何环境而不是基地打开 anaconda 导航器
- r - 如何生成包含所有相关小数位的汇总统计表以显示在 R 的结果表中?
- r - 如何格式化'gtsummary :: tbl_summary'中分类变量的位数?
- php - 我如何在 Doctrine 中的多对多关系上执行 findBy?
- python - 正确终止二进制串行消息以使用 pySerial 读取