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

Replacing std::transform, inserting into a std::vector

本文关键字:std vector transform 替换 插入      更新时间:2023-10-16

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

...
// std::vector<int> new_args(); <-- not working
std::vector<int> new_args(args.size());
std::transform(args.begin(),args.end(),new_args.begin(),transformers());

有没有一种将值插入std::向量的std:transform方式?

您不需要预先确定要用变换填充的向量的大小。使用std::back_inserter它将充当向量的迭代器,但实际上将调用push_back()将元素插入到向量中。

所以你的代码看起来像

std::vector<int> new_args;
new_args.reserve(args.size); // use this so you don't have grow the vector geometrically.
std::transform(args.begin(),args.end(),std::back_inserter(new_args),transformers());

您可以使用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<int> new_args; 创建一个空的std::vector

感谢上帝,有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";
}