Adh*_*ham 6 c++ c++20 std-ranges
我被分配了一项任务,需要在考虑到几个限制的情况下解决问题。重点是强制使用 STL 算法、迭代器和新的 c++20 功能,包括ranges. 然而,我已经阅读了几个小时的范围,但我仍然无法弄清楚如何在考虑到所有限制的情况下实现该问题。我简化了问题并删除了具体细节以使其更加通用。
问题:
编写一个函数,该函数 1) 接受自定义对象的向量2) 返回不同类型input的向量,其中包含满足某些条件的每个对象的元素。添加的值基于输入对象的属性。input
我意识到这可能听起来很晦涩,所以这里有一个简单的例子。对于形状的输入向量,其中每个形状都有一个名称和一个区域:
vector<Shapes> input{ { "Square", 10 }, { "Triangle", 30 } , { "Square", 1 }, { "Circle", 30 }, { "Triangle", 15 } };
Run Code Online (Sandbox Code Playgroud)
返回枚举向量
enum Color { RED, BLUE, GREEN };
Run Code Online (Sandbox Code Playgroud)
这样为每个 Square 或 Circle 添加一个枚举。枚举的值是根据每个 Shape 的面积确定的。因此,假设面积大于 20,则添加红色,否则添加绿色。
所以在这种情况下我们会返回{ GREEN, GREEN, RED }
这一切都很好,可以通过多种方式实施,但限制因素使其变得非常困难。
限制条件:
std::for_eachstd::vector我的教授声称“c++20 范围使这项任务特别简单”。但即使在阅读了几个小时的范围后,我什至不知道该从哪里开始。我当前的思路是创建 astd::view并且filter它基于条件(正方形和圆形),但是我不确定如何创建不同类型的新向量并根据元素的属性向其添加元素在视图中不使用循环、for_each或按引用 lambda。
cpt*_*ssa 10
如果您只是想将每个形状转换为枚举,您需要的是:
auto colors = input | transform([](const Shapes& s){return s.size > 20 ? RED : GREEN;});
Run Code Online (Sandbox Code Playgroud)
colors然后可以在 for 循环中循环:
for (const auto& c : colors)
或者做成一个新的向量:
std::vector<Color> colorEnums{colors.begin(), colors.end()};
...尽管 C++23ranges::to对后者会有帮助。
如果您只想为输入向量中的某些元素生成颜色元素(例如:不是三角形),请在变换之前添加过滤器,例如:
auto colors = input |
filter([](const Shapes& s){return s.type != "Triangle";}) |
transform([](const Shapes& s){return s.size > 20 ? RED : GREEN;});
Run Code Online (Sandbox Code Playgroud)
请注意,在转换之后使用过滤器也可以工作,但效率较低,因为代码会先转换所有元素,然后再丢弃其中一些元素。所以尽早使用过滤器。