我不经常使用std :: transform,但是我发现它非常有用,并且我开始用这种算法替换一些for循环。
这是怎么了?我想保留向量vec的所有元素,这些代码的代码>100。我希望有一个带有3个元素的新std :: vector:133、144和155。但是在算法之后,大小为0。 ?
this.input.value = ''
答案 0 :(得分:4)
transform
不会在输出序列中插入元素,它只是写入*iter
并递增迭代器。
如果要插入序列,请使用std::back_inserter(final)
作为输出迭代器。
或者,首先调用final.resize(vec.size())
,以将输出向量设置为正确的大小。请注意,这会将向量元素初始化为零,因此对于大向量,将产生明显的时间开销。
答案 1 :(得分:1)
一次过滤和变换:
template<class Container>
struct optional_inserter_iterator: std::back_insert_iterator //convenience
{
using std::back_insert_iterator::*;
optional_inserter_iterator(Container &c) : std::back_insert_iterator(c)
{}
optional_inserter_iterator & operator=(std::optional<Container::value_type> &&opt)
{
if(opt)
std::back_insert_iterator::operator=(*std::move(opt))
return *this;
}
}
在转换中使用它,让您的lambda返回可选的
(未经测试)
编辑:有一些原因不继承自std::back_insert_iterator
。如果有人对一个真正正确的版本感兴趣,我可以做一个。