c++ - 使用 std::transform 构造一个 std::vector。返回未命名结果的可能性?
问题描述
让我们
class InputClass;
class OutputClass;
OutputClass const In2Out(InputClass const &in)
{
//conversion implemented
}
最后
std::vector<OutputClass> Convert(std::vector<InputClass> const &input)
{
std::vector<OutputClass> res;
res.reserve(input.size());
//either
for (auto const &in : input)
res.emplace_back(In2Out(in));
return res;
//or something like
std::transform(input.begin(), input.end(), std::back_inserter(res), [](InputClass const &in){return In2Out(in);});
return res;
}
现在我的问题:
我可以以某种方式重写 Convert 函数以避免需要命名新容器吗?IE。有没有办法直接使用类似于 std::transform 或 std::for_each 的东西来构造向量?
如(伪代码,这毫不奇怪甚至无法构建)
std::vector<OutputClass> Convert(std::vector<InputClass> const &input)
{
return std::transform(input.begin(), input.end(), std::back_inserter(std::vector<OutputClass>()), [](InputClass const &in){return In2Out(in);});
}
搜索,但没有找到任何优雅的解决方案。谢谢!
解决方案
从 C++ 20 开始,您可以使用 newstd::ranges::transform_view
来完成您想要的。它将为它正在适应的容器中的每个元素调用您的转换函数,您可以使用该视图来调用std::vector
的迭代器范围构造函数,该构造函数将为整个向量分配一次内存,然后填充元素。它仍然需要您在函数中创建一个变量,但它变得更加精简。那会给你类似的东西
std::vector<OutputClass> Convert(std::vector<InputClass> const &input)
{
auto range = std::ranges::transform_view(input, In2Out);
return {range.begin(), range.end()};
}
请注意,这应该优化到您的函数生成的完全相同的代码。
推荐阅读
- java - Java:如何对封装注入或生成的依赖项进行单元测试?
- php - 通过 http 从 PHP 到 Angular 6 的二进制数据
- kotlin - 如何处理kotlin中的多态性
- android - 我的应用程序屏幕在物理设备上显示错误
- graphql - Apollo / GraphQL 具有不同参数的相同查询
- node.js - Passport.authenticate 不在 Node/MongoDB 应用程序中调用
- excel - 更改数据透视图的标题
- javascript - 使用语言环境解析时日期无效
- javascript - 解压缩文件并以角度将内容上传到Firestore后如何调用函数?
- c++ - 当状态发生变化时,是否有 QML 元素来通知辅助功能树?