我被分配了一个任务,需要在给定多个约束条件的情况下解决问题。目的是强制使用STL算法、迭代器和新的C++20功能,其中包括像
问题:
编写一个函数,该函数 1) 接受自定义对象向量
我意识到这可能听起来很模糊,这里有一个简单的例子:对于一个形状(Shapes)的输入向量,每个形状都有一个名称和一个面积。
为了使每个正方形或圆形的面积基于其面积确定枚举的值。 因此,假设如果面积大于20,则添加RED,否则添加GREEN。 因此,在这种情况下,我们将返回{ GREEN,GREEN,RED }。
这很好理解并且可以用多种方法实现,但是约束条件使其非常困难。
约束条件:
- 没有循环或递归 - 没有std::for_each - 除std::vector之外没有其他数据结构 - 除一次性为返回向量分配内存之外,没有其他内存分配 - 没有通过引用的lambda捕获或可变lambda - 不能修改输入向量
我的教授声称“C ++ 20范围使这个任务特别简单。”但是即使阅读了几个小时的范围,我也不确定从哪里开始。 我目前的思路是创建一个std :: view并根据条件(正方形和圆形)进行过滤,但是我不确定如何创建一个新的不同类型的向量,并根据视图中元素的属性将元素添加到其中,而不使用循环,for_each或通过引用的lambda ......
ranges
这样的东西。然而我已经阅读了几个小时有关ranges的资料,但仍然无法弄清楚如何实现所给出的所有约束条件下的问题。我简化了问题并删除了具体细节,以使其更加通用。问题:
编写一个函数,该函数 1) 接受自定义对象向量
input
2)返回一个包含每个满足某些条件的对象对应值的不同类型向量。我意识到这可能听起来很模糊,这里有一个简单的例子:对于一个形状(Shapes)的输入向量,每个形状都有一个名称和一个面积。
vector<Shapes> input{ { "Square", 10 }, { "Triangle", 30 } , { "Square", 1 }, { "Circle", 30 }, { "Triangle", 15 } };
返回一个枚举向量
enum Color { RED, BLUE, GREEN };
为了使每个正方形或圆形的面积基于其面积确定枚举的值。 因此,假设如果面积大于20,则添加RED,否则添加GREEN。 因此,在这种情况下,我们将返回{ GREEN,GREEN,RED }。
这很好理解并且可以用多种方法实现,但是约束条件使其非常困难。
约束条件:
- 没有循环或递归 - 没有std::for_each - 除std::vector之外没有其他数据结构 - 除一次性为返回向量分配内存之外,没有其他内存分配 - 没有通过引用的lambda捕获或可变lambda - 不能修改输入向量
我的教授声称“C ++ 20范围使这个任务特别简单。”但是即使阅读了几个小时的范围,我也不确定从哪里开始。 我目前的思路是创建一个std :: view并根据条件(正方形和圆形)进行过滤,但是我不确定如何创建一个新的不同类型的向量,并根据视图中元素的属性将元素添加到其中,而不使用循环,for_each或通过引用的lambda ......
std::views::filter
和创建lambda函数来创建了一个过滤器视图,其中包含满足条件的输入向量元素。 接下来的部分是我卡住的地方... - Adhamrangess::to_vector
(它是通过 for 循环实现的)将你过滤和转换后的范围转换为向量,因为 c++20 不提供这个功能(只有在 c++23 中才有)。你必须使用 range-v3 或使用 for 循环。for 循环总是存在于某个地方,ranges 很好,因为它们将它们推入到你不必担心的代码中。 - Tom Huntingtonviews::transform
也可以转换视图元素的数据类型。经过转换后,我只需要使用生成的视图的begin
和end
迭代器创建一个向量(正如@cptFracassa在他的答案中所说)就行了,结果很棒。感谢你的支持。 - Adham