定义将函数调用到传递的元素的自定义迭代器
Define custom iterator that calls function to passed element
我经常编写如下代码(这里int和double只是示例,类型通常是指针(
std::vector<int> va {1 ,2, 3};
std::vector<double> vb;
bool valid(int i) { return i % 2 == 0;}
for(auto a : va)
if (valid(a))
vb.push_back(static_cast<double>(a));
由于我们没有transform_if
我想知道是否有办法通过定义一些特殊的迭代器来做到这一点:
template<typename T>
struct inserterStaticCast
{
// not sure what to put here...
}
然后我可以写这样的代码
std::vector<double> vc(a.size());
std::copy_if(a.begin(), a.end(), inserterStaticCast<double>(vc), &valid);
我也会对backInserterStaticCast
版本感兴趣。
这在 C++11 中可能吗?
谢谢
一些澄清...
我不能使用提升。在这种情况下,int 和 double 仅用于说明,在一般情况下,我确实需要一个演员表,通常是这样的 static_cast<derived *>(base_ptr)
.
我认为你想要提升的function_output_iterator
.在您的示例中,它将是
auto cast_back_iterator = make_function_output_iterator([&b](int i){ b.push_back(static_cast<double>(i)); });
std::copy_if(a.begin(), a.end(), cast_back_iterator, valid);
当两种类型之间没有隐式转换时,例如使用 Base *
-> Derived *
转换时,这更有意义
您可以使用
std::copy_if
和std::back_inserter
进行过滤:
std::vector<double> vc;
std::copy_if(va.begin(), va.end(), std::back_inserter(vc), valid);
或者使用boost::range::adaptors::filtered
(与您的示例问题相同(:
#include <boost/range/adaptor/filtered.hpp>
#include <boost/range/algorithm/copy.hpp>
#include <vector>
bool valid(int i) { return i % 2 == 0;}
int main() {
std::vector<int> va {1 ,2, 3};
using namespace boost::adaptors;
auto vb = boost::copy_range<std::vector<double>>(va | filtered(valid));
}
请注意,将int
转换为double
是隐式的,不需要强制转换。
如果您确实需要转换,只需输入transformed
:
auto vb = boost::copy_range<std::vector<double>>(va
| filtered(valid)
| transformed([](int a) { return static_cast<double>(a); })
);
相关文章:
- 如何绘制自定义形状的元素?
- 从自定义类获取对象向量中的 max 元素
- gtest 期望无序元素与自定义比较器/匹配器一起使用
- 从自定义数据类型向量中删除重复元素
- 如何在不使用 vector::erase() 的情况下编写自定义 Vector 方法来删除元素?
- C++ - 按自定义数据类型向量的值删除元素
- 对自定义元素向量进行排序时出现意外(至少对我来说)行为
- 使用自定义比较器C++映射,不插入所有元素
- 通过Overloading Operator []访问自定义数组包装器中的元素
- 尝试自定义一个函数来对不同种类元素的向量进行排序
- 使用 C++ 中的自定义元素进行 Const 结构初始化
- 定义将函数调用到传递的元素的自定义迭代器
- 如何使用完全自定义的GUI元素来自定义操作系统设计
- 通过与不同类型的值进行自定义比较来查找 std::set 的元素
- 设置要与无序集合一起使用的自定义类 - 在集合中找不到元素
- 自定义容器在保留空间时不必要地创建新元素实例
- 如何在 c++ 中从文件创建自定义 QML 元素
- 如何比较/排序包含自定义 typedef 的列表容器的元素
- 具有元素自定义构造函数的对象数组/向量
- 当矢量至少有1个元素时,自定义对象的std::find_if返回错误的迭代器