在插入容器之前转换输出迭代器
Transforming an OutputIterator before inserting into a container
我有一个函数定义如下:
template <class Iter> Iter generate(Iter);
其中 Iter 的行为应该像输出迭代器一样,返回的迭代器是生成的最后一个元素之后的一个元素(类似于std::transform
的第三个参数(
我想调用此函数,对生成的每个项目应用谓词,然后将其余元素转换为其他类型。我知道我可以按如下方式执行此操作:
std::vector<some_type> generated_raw;
generate(std::back_inserter(generated_raw));
generated_raw.erase(std::remove_if(generated_raw.begin(), generated_raw.end(), predicate));
std::vector<other_type> generated;
std::transform(generated_raw.begin(), generated_raw.end(), std::back_inserter(generated), transform);
其中谓词和变换都是函数。
但是,这是低效的,因为它涉及一个中间容器,其中存储了每个生成的元素 - 即使是那些稍后将被擦除/remove_if调用拒绝的元素。有没有更好的方法?
这样的事情应该可以解决问题:
template<class Iter, class Pred>
struct PredicatedIter {
Iter it;
Pred pr;
PredicatedIter& operator=(const typename Iter::Container::value_type &v) {
if(pr(v)) {
it = v;
}
return *this;
}
PredicatedIter& operator=(typename Iter::Container::value_type &&v) {
if(pr(v)) {
it = std::move(v);
}
return *this;
}
// no-ops as in back_insert_iterator
PredicatedIter& operator++() {
return *this;
}
PredicatedIter& operator++(int) {
return *this;
}
PredicatedIter& operator*() {
return *this;
}
};
PS:我在这里做了类似的事情,并在这里重新设计了我的答案。
相关文章:
- 通过构造函数方法输出的类到类类型转换是 5500 为什么不是 5555
- 在插入容器之前转换输出迭代器
- 字符数组到十六进制字符串的转换 - 意外输出
- 将ctypes c_void_p强制转换为c输出参数
- 使用递归函数 (c++) 将长字符串转换为整数时输出错误
- 输出使用 cout 转换为 ASCII 的文本时输出格式不正确,C++
- 输入 1024 后十进制到二进制转换的输出错误?
- 无效* 转换获得意外输出
- 有没有一种简单的方法可以将矢量 int 集转换为字符串输出?
- 是否可以转换 c++ 运算符新输出?
- 为什么我的C++程序输出不同的数字来将米转换为英尺?
- 为什么给我输出 2 我使用类型转换?
- 使用 iconv 进行 UTF8 转换的输出不正确
- 如何将 Openh264 解码帧无延迟输出格式转换为 OpenCV 矩阵
- 我将 c++ 矢量数据集转换为 c 数组.我将相同的数据集传递到一个应该给出相同输出的函数中
- strtoull() 的输出在转换为双精度然后又转换为 uint64_t 时会失去精度
- 为什么当我在MD5 Hash中转换相同的C 字符串时,每次都会获得不同的输出
- 在 C++ 中从字符串转换为常量字符*时出现奇怪的输出
- 如何获得一个循环来在屏幕c++上转换输出
- 意外的大端转换输出