【发布时间】:2019-11-27 10:44:38
【问题描述】:
我真的是 C++ 的菜鸟,所以如果我的问题显示缺乏基本知识,请不要介意。
我有一个类 User 来描述我系统中的用户。它包含简单的字段,如string name、string email、int age 等。
我还有一个包装类 Group,它使用 std::list 来存储用户集合。我想要做的是使用迭代器设计模式,以便为 Group 类提供两个不同的迭代器。通过使用其中一个迭代器,我希望能够遍历按用户姓名排序的列表,并使用另一个我想做同样的事情,除了它应该按用户的年龄排序。
我阅读了这篇关于迭代器设计模式的文章 (https://www.robertlarsononline.com/2017/04/24/iterator-pattern-using-cplusplus/),但我不确定如何根据我的情况调整显示的代码。我猜我的 Group 类需要有两个 CreateIterator() 方法(即:CreateAgeIterator() 和 CreateNameIterator()),每一个都返回 Iterator 类的不同特化。问题是我不知道我应该将根据特定标准对列表进行排序的逻辑放在哪里。
这只是我正在做的一个基本项目,用于研究一点语言以及迭代器设计模式本身。我不关心是否符合 STL 或任何其他问题,我只需要简单地实现这个概念。
【问题讨论】:
-
AFAICS,您基本上是要求为您编写代码,这不会发生。此外,您发布的链接对于 C++ 来说非常不习惯,在我看来,这是一种解决问题的糟糕方法。改为查看
<algorithm>和 lambdas。 -
@ViníciusSilva
std::list大致相当于 Java 中的 LinkedList。您使用 LinkedList 的频率如何? -
在 C++ 中使用组的一种相当惯用的方式是:
for (auto it = group.age_begin(); it != group.age_end(); ++it) { do_stuff(*it); }。有一些算法可以将其包装到单个语句中,但基本方法是范围由 pair 迭代器定义 - 而不是一个知道结束位置的迭代器。 -
正如 Vittorio 所暗示的,您可以使用 sort from
<algorithm>按给定的比较器对列表进行排序。通过这种方式,您可以按姓名或年龄对列表进行排序。然后std::vector提供函数begin和end,它们为您提供了向量上的迭代器。 -
@ViníciusSilva 我会搜索“在 C++ 中实现迭代器”。删除“模式”部分,因为 C++ 中的迭代器不使用接口和继承来解决这个问题。检查泛型代码中使用的类型概念“前向迭代器”。
标签: c++ design-patterns iterator containers