我希望以类似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";
}