我有一个链接列表:
MyLinkedList::LinkedList<Event *> list;
来自LinkedList
这个库,并且Event
是这个结构:
typedef struct
{
TimeSpan time;
int value;
bool queued;
} Event;
TimeSpan
来自这个图书馆的地方。用一些项目填充列表后,我运行以下函数:
bool Events::Save()
{
// order the elements by the time
_listEvents.sort(compare);
// open a file for writing
for (int i = 0; i < _listEvents.size(); i++)
{
Event *event = _listEvents.get(i);
// write the item to the file
writeEvent(file, *event);
}
file.close();
return true;
}
该compare
函数定义如下:
int compare(Event *&ev1, Event *&ev2)
{
if (ev1->time.hours() > ev2->time.hours()) return true;
if (ev1->time.hours() < ev2->time.hours()) return false;
return (ev1->time.minutes() > ev2->time.minutes());
}
它只是按元素的时间对元素进行排序。这段代码工作正常。
现在我需要处理queued
结构中的标志。这里是一个示例输入数据:
时间 | 价值 | 排队 |
---|---|---|
18:00 | 1 | 错误的 |
xx:xx | 2 | 真的 |
xx:xx | 3 | 真的 |
10:30 | 4 | 错误的 |
xx:xx | 5 | 真的 |
08:15 | 6 | 错误的 |
06:45 | 7 | 错误的 |
queued
排序时,设置了标志的项目必须位于前一个项目(queued
未设置)之后,无论其时间值如何(因此xx:xx
在表中)。
预期输出是:
时间 | 价值 | 排队 |
---|---|---|
06:45 | 7 | 错误的 |
08:15 | 6 | 错误的 |
10:30 | 4 | 错误的 |
xx:xx | 5 | 真的 |
18:00 | 1 | 错误的 |
xx:xx | 2 | 真的 |
xx:xx | 3 | 真的 |
换句话说:如果queued
是,则false
元素将照常排序(按时间),如果是,则true
它们必须遵循前一个元素(就像它们“分组”在一起)。
由于该compare
函数只能处理两个项目,并且除了初始订单之外我没有其他信息,因此如何将这些queued
项目与其“父”项目保留在一起?
首先将您的列表分组。在你的例子中,
[1, 2, 3, 4, 5, 6, 7]
变成[[1, 2, 3], [4, 5], [6], [7]]
.然后按每组中第一个元素的时间戳对它们进行排序。
[[1, 2, 3], [4, 5], [6], [7]]
变成[[7], [6], [4, 5], [1, 2, 3]]
.然后压平该列表以获得
[7, 6, 4, 5, 1, 2, 3]
.使用
std::vector
,这可能看起来像:带输出: