替换std :: transform,插入std :: vector

时间:2015-11-04 13:06:59

标签: c++ c++11 stl stl-algorithm

我希望以类似std :: transform的方式将值插入到std :: vector中。 std :: transform需要一个预先设定的第三个参数,但在我的情况下,大小取决于变换器()并且是不可预测的。

    db.movies.explain().update({your_query})

是否有std:transform-ish方法将值插入std :: vector?

3 个答案:

答案 0 :(得分:4)

您不需要预先调整要用变换填充的向量。使用std::back_inserter它将像向量的迭代器一样,但实际上会调用push_back()将元素插入到向量中。

所以你的代码看起来像

std::vector<int> new_args;
std::transform(args.begin(),args.end(),std::back_inserter(new_args),transformers());

答案 1 :(得分:2)

您可以使用std::back_inserter使用.push_back向向量添加值:

std::vector<int> new_args;
std::transform(args.begin(),args.end(),std::back_inserter(new_args),transformers());

BTW:std::vector<int> new_args();是一个函数声明。您可以使用std::vector

创建一个空的std::vector<int> new_args;

答案 2 :(得分:0)

感谢上帝,那里有boost :: range。

由于输入和输出的大小和类型不同,std :: copy_if和std :: transform没有帮助。

#include <boost/range/adaptor/filtered.hpp>
#include <boost/range/adaptor/transformed.hpp>
#include <boost/range/algorithm_ext/push_back.hpp>
#include <iostream>
#include <vector>
#include <string>
#include <cmath>

struct is_even
{
    bool operator()(int x) const {return x%2==0;}
};

struct to_square_root
{
    float operator()(int x) const {return std::sqrt(x);}
};

int main(int argc, const char* argv[])
{
    std::vector<int> input={1,2,3,4,5,6,7,8,9};
    std::vector<float> output;

    boost::push_back (
        output
      , input
      | boost::adaptors::filtered(is_even())
      | boost::adaptors::transformed(to_square_root())
    );

    for(auto i: output) std::cout << i << "\n";
}