如何使用Iterator设计模式为C ++中的包装容器类提供多个迭代器?

时间:2019-07-18 13:20:50

标签: c++ design-patterns iterator containers

我真的是C ++的新手,所以请不要介意我的问题是否缺乏基础知识。 我有一个类User,它描述了系统中的一个用户。它包含简单的字段,例如string namestring emailint age等。 我也有一个包装类Group,它使用std::list来存储一组用户。我要做的是使用Iterator设计模式,以便为Group类提供两个不同的迭代器。通过使用其中一个迭代器,我希望能够浏览按用户名排序的列表,而通过使用另一个迭代器,我想做同样的事情,只是它应按用户的年龄排序。

我阅读了有关Iterator设计模式的文章(https://www.robertlarsononline.com/2017/04/24/iterator-pattern-using-cplusplus/),但不确定如何使显示的代码适合我的情况。我猜想我的Group类需要有两个CreateIterator()方法(即CreateAgeIterator()CreateNameIterator()),每个方法都返回Iterator类的不同专业化。问题是我不知道应该将逻辑根据特定条件对列表进行排序的确切位置。 这只是一个基础项目,我正在研究一些语言以及Iterator设计模式本身。我不关心是否符合STL或其他任何要求,我只需要简单实现该概念即可。

1 个答案:

答案 0 :(得分:0)

  

我希望能够浏览按用户名排序的列表,并使用另一项,除了要按用户的年龄排序之外,我也想做同样的事情。

为了按排序顺序迭代列表,必须根据该顺序对列表进行排序。但是列表只能有一个顺序。

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

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

  

问题是我不知道应该根据特定条件将列表排序的逻辑到底放在哪里。

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

请注意,列表中的元素应为const,以便您不能通过修改对象的状态来破坏顺序。