使用std :: transform最终向量保持为空

时间:2019-11-27 11:01:16

标签: c++ stl c++14

我不经常使用std :: transform,但是我发现它非常有用,并且我开始用这种算法替换一些for循环。

这是怎么了?我想保留向量vec的所有元素,这些代码的代码>100。我希望有一个带有3个元素的新std :: vector:133、144和155。但是在算法之后,大小为0。 ?

this.input.value = ''

2 个答案:

答案 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。如果有人对一个真正正确的版本感兴趣,我可以做一个。