优先级队列适用于矢量但不适用于列表

时间:2014-11-08 03:13:50

标签: list vector stl priority-queue

我正在收紧一些渲染代码,而不是将所有可渲染对象存储在一个普通的ol矢量中,我决定使用优先级队列(这样透明度之类的东西可以自动优先正确)。但是我无法使用列表作为底层数据结构。我已经尝试使用仿函数和重载<运营商。它抱怨:

Error   8   error C2676: binary '-' : 'std::_List_iterator<std::_List_val<std::_List_simple_types<IRenderable *>>>' does not define this operator or a conversion to a type acceptable to the predefined operator   c:\program files (x86)\microsoft visual studio 12.0\vc\include\algorithm    2425    1   ObjLoaded
Error   4   error C2676: binary '-' : 'std::_List_unchecked_iterator<std::_List_val<std::_List_simple_types<IRenderable *>>>' does not define this operator or a conversion to a type acceptable to the predefined operator c:\program files (x86)\microsoft visual studio 12.0\vc\include\algorithm    2331    1   ObjLoaded
Error   7   error C2784: 'unknown-type std::operator -(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)' : could not deduce template argument for 'const std::_Revranit<_RanIt,_Base> &' from 'std::_List_iterator<std::_List_val<std::_List_simple_types<IRenderable *>>>' c:\program files (x86)\microsoft visual studio 12.0\vc\include\algorithm    2425    1   ObjLoaded
Error   3   error C2784: 'unknown-type std::operator -(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)' : could not deduce template argument for 'const std::_Revranit<_RanIt,_Base> &' from 'std::_List_unchecked_iterator<std::_List_val<std::_List_simple_types<IRenderable *>>>'   c:\program files (x86)\microsoft visual studio 12.0\vc\include\algorithm    2331    1   ObjLoaded
Error   6   error C2784: 'unknown-type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : could not deduce template argument for 'const std::reverse_iterator<_RanIt> &' from 'std::_List_iterator<std::_List_val<std::_List_simple_types<IRenderable *>>>'   c:\program files (x86)\microsoft visual studio 12.0\vc\include\algorithm    2425    1   ObjLoaded
Error   2   error C2784: 'unknown-type std::operator -(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : could not deduce template argument for 'const std::reverse_iterator<_RanIt> &' from 'std::_List_unchecked_iterator<std::_List_val<std::_List_simple_types<IRenderable *>>>' c:\program files (x86)\microsoft visual studio 12.0\vc\include\algorithm    2331    1   ObjLoaded
Error   5   error C2784: 'unknown-type std::operator -(std::move_iterator<_RanIt> &,const std::move_iterator<_RanIt2> &)' : could not deduce template argument for 'std::move_iterator<_RanIt> &' from 'std::_List_iterator<std::_List_val<std::_List_simple_types<IRenderable *>>>'    c:\program files (x86)\microsoft visual studio 12.0\vc\include\algorithm    2425    1   ObjLoaded
Error   1   error C2784: 'unknown-type std::operator -(std::move_iterator<_RanIt> &,const std::move_iterator<_RanIt2> &)' : could not deduce template argument for 'std::move_iterator<_RanIt> &' from 'std::_List_unchecked_iterator<std::_List_val<std::_List_simple_types<IRenderable *>>>'  c:\program files (x86)\microsoft visual studio 12.0\vc\include\algorithm    2331    1   ObjLoaded

这就是我宣布优先级队列的方式:

priority_queue<IRenderable*, list<IRenderable*>> m_renderlist; 

重载&lt;运营商。如果我做一个简单的改变,一切都会运行:

priority_queue<IRenderable*, vector<IRenderable*>> m_renderlist;

任何想法为什么会发生在这里?为了完整起见,这是我的重载和函子:

bool IRenderable::operator<(const IRenderable* comp)
{
    if (this->GetPriority() < comp->GetPriority())
        return true;
    return false;
}

//class IRenderableComp
//{
//public:
//    bool operator()(const IRenderable* first, const IRenderable* second)
//    {
//        if (first->GetPriority() < second->GetPriority())
//           return true;
//       return false;
//    }
//};

不是非常重要,因为我可以使用向量,但这些小东西会让我烦恼,我想了解原因。任何见解将不胜感激。感谢

1 个答案:

答案 0 :(得分:0)

  

23.6.4 / 1 具有随机访问迭代器和支持操作front()push_back()pop_back()的任何序列容器都可以用于实例化priority_queue

     

23.3.5.1/1 list是一个支持双向迭代器的序列容器 ...

强调我的。