2-prop排序列表的正确数据结构是什么?

时间:2013-05-22 07:59:38

标签: c++ data-structures stl

我正在编写一个简单的无手ui框架,我需要自己发送所有消息。

每个小部件都有一个子列表,它有两个属性:绘制顺序(接收绘制消息的顺序)和其他事件顺序(接收除绘制之外的消息的顺序)。

void Widget::sortChildWidgets( SortMode mode )
{
    if (mode == kSortByPaint) {
        //return true if should precede otherwise return false;
        m_children.sort([&](Widget* pw1, Widget* pw2) ->bool {
            if (pw1->getPaintOrder() < pw2->getPaintOrder()) {
                return true;
            } else {
                return false;
            }
        });
    }

    if (mode == kSortByEvent) {
        //return true if should precede otherwise return false;
        m_children.sort([&](Widget* pw1, Widget* pw2) ->bool {
            if (pw1->getEventOrder() < pw2->getEventOrder()) {
                return true;
            } else {
                return false;
            }
        });
    }
}

因为小部件可以在运行时更改其顺序,所以每次我发送任何消息时都需要求助,这绝对是太糟糕了。

我的问题:是否有更好的数据结构而不是std :: list来解除每次调度消息时的排序,或者我需要维护过于std :: list并在每次将子项插入窗口小部件时对其进行排序?

1 个答案:

答案 0 :(得分:1)

保持订购商品的推荐数据结构为std::set。您可以为排序提供自定义谓词,从而将相同的项目保留在具有不同排序的多个集合中。

如果您需要更高的性能,可以查看Boost.Multi-Index。这是一个用于保持同一数据集的多个视图具有不同排序的库。

请注意,这些数据结构都没有假设键的值在添加后不会改变。

相关问题