替换std::transform,插入到std::vector中
Replacing std::transform, inserting into a std::vector
我希望以类似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";
}
相关文章:
- 使用std::vector的OpenCL矩阵乘法
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- std::vector的包装器,使数组的结构看起来像结构的数组
- 编译器如何区分std::vector的构造函数
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 在std::vector上存储带有模板的类实例
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 为什么std::vector比数组慢
- std::vector::迭代器是否可以合法地作为指针
- 如何将二进制格式的 C++ 对象的 std::vector 保存到磁盘?
- 为什么std::vector和std::valarray初始化构造函数不同
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 在没有未定义行为的情况下实现类似std::vector的容器
- 如何调整 std::vector of Eigen::MatrixXd 的大小
- 使用 std::vector::reverse_iterator 将 int 序列化为字节向量?
- 如何将AERT_Allocate与 std:vector 一起使用
- 推导 std::vector::back() 的返回类型
- 如何将原始字节附加到 std::vector?
- std::vector 没有重载函数的实例与参数列表匹配
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?