2013-05-22 118 views
1

我正在寫一個簡單的無需使用的UI框架,其中我需要通過我自己調度所有消息。2-prop排序列表的正確數據結構是什麼?

每個窗口小部件都有一個子窗口列表,它有兩個屬性:繪畫順序(接收繪畫消息的順序)和其他事件順序(接收消息而不是繪畫的順序)。

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

用於保存物品的推薦數據結構是std::set。您可以爲訂購提供自定義謂詞,從而將不同訂單的相同商品保留在多個集合中。

如果您需要更多性能,可以查看Boost.Multi-Index。這是一個圖書館,旨在保持不同順序的同一數據集的多個視圖。

請注意,這些數據結構都不會假定一個密鑰的值一旦添加就不會改變。

+0

在這個項目中,我無法使用boost等重庫。也許,我需要維護一個std :: list,兩個std :: set! – Jichao

+0

@Jichao:你確定你需要一個'std :: list'嗎?一個'std :: vector'幾乎總是更高效。 –

相關問題