返回列表子集的最佳方法是什么?

时间:2010-12-27 02:41:23

标签: c++ algorithm

我有一份任务清单。任务由名称,截止日期(和时间)和持续时间定义。

我的TaskManager类处理按截止日期排序的std::list<Task>。它必须提供一种在特定日期完成任务的方法。

一个例子:我的任务1在星期一上午6点到期,任务2在星期一上午9点​​到期,任务3在星期二下午7点到期。如果我将“Monday”传递给我的方法,它应该返回任务1和2。

你会如何实现?

我认为(从API的角度来看)一个好方法是提供std::list<Task>::iterator对。所以我会有一个TaskManager::begin(date)方法。你认为这个方法应该通过从列表的开头迭代直到它找到该日期的第一个任务,或者从std::map<date, std::list<Task>::iterator>获取它来获取迭代器(但是我们必须保持它 - - 添加或删除任务时的日期)?

然后,我怎样才能实现TaskManager::end(date)方法?

3 个答案:

答案 0 :(得分:6)

而不是使用std::list,请考虑使用std::setstd::map,这可以使项目保持排序顺序,而无需额外的努力。然后,您可以使用std::set::lower_boundstd::map::lower_bound找到特定日期到期的项目。

答案 1 :(得分:1)

在排序的序列中查找项目可以O(log n),而您的方法需要O(n)

如果要构建您的收藏品,您已经对已排序的项目使用了std::vector:最后推送任何项目将花费O(1),您将能够使用二进制搜索在O(log n)

中找到您的商品

否则(如果您按随机顺序插入项目)使用std::map(使用日期作为键)或std::set来添加和搜索O(log n)

中的项目

答案 2 :(得分:0)

您可以使用迭代器适配器。基本上这是一个迭代器,它的构造函数将另一个迭代器作为参数,并且其advance方法使迭代器前进,直到找到满足某个条件的值,然后返回该值或从中计算出的某个值。