簡體   English   中英

優化std :: deque中的搜索

[英]Optimize search in std::deque

我正在做一個具有不同類型對象的程序,它們都是虛擬類的子代。 我正在這樣做尋找多態的優點,允許我從管理器類調用所有對象的某個方法,而不檢查它的特定類型的對象。

關鍵是不同類型的對象有時需要獲取某種類型的對象列表。

在那一刻,我的經理類循環考慮所有對象並檢查對象的類型。 它創建一個列表並返回如下:

std::list<std::shared_ptr<Object>> ObjectManager::GetObjectsOfType(std::string type)
{
    std::list<std::shared_ptr<Object>> objectsOfType;

    for (int i = 0; i < m_objects.size(); ++i)
    {
        if (m_objects[i]->GetType() == type)
        {
            objectsOfType.push_back(m_objects[i]);
        }
    }

    return objectsOfType;
}

m_objects是一個雙端隊列。 我知道迭代一個數據結構通常很昂貴,但我想知道是否有可能對它進行一點點潤滑,因為現在這個函數占用了程序中所用時間的三分之一。

我的問題是: 為了降低我的程序中的操作成本,我是否有任何設計模式或功能?

在給定的代碼中,只有一個可以在本地完成的優化:

for (auto const& obj : m_objects)
{
    if (obj->GetType() == type)
    {
        objectsOfType.push_back(obj);
    }
}

基本原理是operator[]通常不是訪問deque的最有效方式。 話雖如此,我預計不會有重大改進。 您的引用位置非常差:您實際上是在查看兩個解引用( shared_ptrstring )。

一種邏輯方法是使m_objects成為按類型鍵入的std::multimap

你可以采取一些措施加快速度:

  • 將類型存儲在基類上,這將刪除一些有點昂貴的虛擬查找。
  • 如果type是string等,則更改為a
    simpel類型,如enum或int
  • vector更有效率
    遍歷而不是deque
  • 如果繼續使用deque ,請使用迭代器或基於for循環的范圍來避免隨機查找(在deque中更昂貴)

基於范圍看起來像這樣:

for (auto const& obj : m_objects)
{
    if (obj->GetType() == type)
    {
        objectsOfType.push_back(obj);
    }
}

更新:另外我建議不要使用std::list (除非出於某種原因你必須),因為它在很多情況下表現不佳 - 再次std::vector涌向救援!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM