【问题标题】:How can I use the Iterator design pattern to provide multiple iterators for a wrapper container class in C++?如何使用迭代器设计模式为 C++ 中的包装容器类提供多个迭代器?
【发布时间】:2019-11-27 10:44:38
【问题描述】:

我真的是 C++ 的菜鸟,所以如果我的问题显示缺乏基本知识,请不要介意。 我有一个类 User 来描述我系统中的用户。它包含简单的字段,如string namestring emailint 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 提供函数beginend,它们为您提供了向量上的迭代器。
  • @ViníciusSilva 我会搜索“在 C++ 中实现迭代器”。删除“模式”部分,因为 C++ 中的迭代器不使用接口和继承来解决这个问题。检查泛型代码中使用的类型概念“前向迭代器”。

标签: c++ design-patterns iterator containers


【解决方案1】:

我希望能够浏览按用户姓名排序的列表,并使用另一个我想做同样的事情,除了它应该按用户的年龄排序。

为了按排序顺序迭代列表,列表必须按照该顺序排序。但是一个列表只能有一个订单。

两种排序的一种解决方案是使用一种顺序对列表进行排序,并具有另一种数据结构,其中包含指向列表元素的指针,但使用另一种排序进行排序。

请注意,这个其他容器的迭代器并不直接指向列表的元素,而是指向指针。因此,使用指针容器本身的迭代器与对包含元素的列表使用迭代器是不同的。

问题是我不知道我应该将根据特定标准对列表进行排序的逻辑放在哪里。

在插入或删除元素时强制执行排序。

请注意,列表的元素应该是 const,这样您就不能通过修改对象的状态来破坏排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 2021-01-19
    • 2010-09-23
    相关资源
    最近更新 更多