[英]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_ptr
和string
)。
一種邏輯方法是使m_objects
成為按類型鍵入的std::multimap
。
你可以采取一些措施加快速度:
string
等,則更改為a 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.