繁体   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