【问题标题】:std::vector<std::pair<int,std::pair<Bone,std::string> > > not sorting by int?std::vector<std::pair<int,std::pair<Bone,std::string>> > 不按 int 排序?
【发布时间】:2011-10-29 09:23:01
【问题描述】:

我有一个std::vector&lt;std::pair&lt;int,std::pair&lt;Bone,std::string&gt; &gt; &gt;

我正在尝试使用 std sort 对其进行排序,并期望它按 int 排序,但我得到了与 sort 调用相关的 21 个错误。

可能出了什么问题?

代码:

std::vector<std::pair<int,std::pair<Bone,std::string> > > tempBones;
std::sort(tempBones.begin(),tempBones.end());

错误:

错误 1 ​​错误 C2784: 'bool std::operator &lt;(const std::basic_string&lt;_Elem,_Traits,_Alloc&gt; &amp;,const _Elem *)' : 无法从 'const skl::Bone' c:\Program Files\Microsoft Visual Studio 9.0\VC\include\utility 102 推断出 'const std::basic_string&lt;_Elem,_Traits,_Alloc&gt; &amp;' 的模板参数

错误 2 错误 C2784: 'bool std::operator &lt;(const _Elem *,const std::basic_string&lt;_Elem,_Traits,_Alloc&gt; &amp;)' : 无法从 'const skl::Bone' c:\Program Files\Microsoft Visual Studio 9.0\VC\include\utility 102 推断出 'const _Elem *' 的模板参数

错误 3 错误 C2784: 'bool std::operator &lt;(const std::basic_string&lt;_Elem,_Traits,_Alloc&gt; &amp;,const std::basic_string&lt;_Elem,_Traits,_Alloc&gt; &amp;)' : 无法从 'const skl::Bone' c:\Program Files\Microsoft Visual Studio 9.0\VC\include\utility 102 推断出 'const std::basic_string&lt;_Elem,_Traits,_Alloc&gt; &amp;' 的模板参数

错误 4 错误 C2784: 'bool std::operator &lt;(const std::_Tree&lt;_Traits&gt; &amp;,const std::_Tree&lt;_Traits&gt; &amp;)' : 无法从 'const skl::Bone' c:\Program Files\Microsoft Visual Studio 9.0\VC\include\utility 102 推断出 'const std::_Tree&lt;_Traits&gt; &amp;' 的模板参数

错误 5 错误 C2784: 'bool std::operator &lt;(const std::vector&lt;_Ty,_Alloc&gt; &amp;,const std::vector&lt;_Ty,_Alloc&gt; &amp;)' : 无法从 'const skl::Bone' c:\Program Files\Microsoft Visual Studio 9.0\VC\include\utility 102 推断出 'const std::vector&lt;_Ty,_Alloc&gt; &amp;' 的模板参数

错误 6 错误 C2784: 'bool std::operator &lt;(const std::list&lt;_Ty,_Ax&gt; &amp;,const std::list&lt;_Ty,_Ax&gt; &amp;)' : 无法从 'const skl::Bone' c:\Program Files\Microsoft Visual Studio 9.0\VC\include\utility 102 推断出 'const std::list&lt;_Ty,_Ax&gt; &amp;' 的模板参数

错误 7 错误 C2784: 'bool std::operator &lt;(const std::reverse_iterator&lt;_RanIt&gt; &amp;,const std::reverse_iterator&lt;_RanIt2&gt; &amp;)' : 无法从 'const skl::Bone' c:\Program Files\Microsoft Visual Studio 9.0\VC\include\utility 102 推断出 'const std::reverse_iterator&lt;_RanIt&gt; &amp;' 的模板参数

错误 8 错误 C2784: 'bool std::operator &lt;(const std::_Revranit&lt;_RanIt,_Base&gt; &amp;,const std::_Revranit&lt;_RanIt2,_Base2&gt; &amp;)' : 无法从 'const skl::Bone' c:\Program Files\Microsoft Visual Studio 9.0\VC\include\utility 102 推断出 'const std::_Revranit&lt;_RanIt,_Base&gt; &amp;' 的模板参数

错误 9 错误 C2784: 'bool std::operator &lt;(const std::pair&lt;_Ty1,_Ty2&gt; &amp;,const std::pair&lt;_Ty1,_Ty2&gt; &amp;)' : 无法从 'const skl::Bone' c:\Program Files\Microsoft Visual Studio 9.0\VC\include\utility 102 推断出 'const std::pair&lt;_Ty1,_Ty2&gt; &amp;' 的模板参数

错误 10 错误 C2676: 二进制 '&lt;' : 'const skl::Bone' 未定义此运算符或转换为预定义运算符可接受的类型 c:\Program Files\Microsoft Visual Studio 9.0\VC\include\utility 10

错误 11 错误 C2784: 'bool std::operator &lt;(const std::basic_string&lt;_Elem,_Traits,_Alloc&gt; &amp;,const _Elem *)' : 无法从 'const skl::Bone' c:\Program Files\Microsoft Visual Studio 9.0\VC\include\utility 103 推断出 'const std::basic_string&lt;_Elem,_Traits,_Alloc&gt; &amp;' 的模板参数

错误 12 错误 C2784: 'bool std::operator &lt;(const _Elem *,const std::basic_string&lt;_Elem,_Traits,_Alloc&gt; &amp;)' : 无法从 'const skl::Bone' c:\Program Files\Microsoft Visual Studio 9.0\VC\include\utility 103 推断出 'const _Elem *' 的模板参数

错误 13 错误 C2784: 'bool std::operator &lt;(const std::basic_string&lt;_Elem,_Traits,_Alloc&gt; &amp;,const std::basic_string&lt;_Elem,_Traits,_Alloc&gt; &amp;)' : 无法从 'const skl::Bone' c:\Program Files\Microsoft Visual Studio 9.0\VC\include\utility 103 推断出 'const std::basic_string&lt;_Elem,_Traits,_Alloc&gt; &amp;' 的模板参数

错误 14 错误 C2784: 'bool std::operator &lt;(const std::_Tree&lt;_Traits&gt; &amp;,const std::_Tree&lt;_Traits&gt; &amp;)' : 无法从 'const skl::Bone' c:\Program Files\Microsoft Visual Studio 9.0\VC\include\utility 103 推断出 'const std::_Tree&lt;_Traits&gt; &amp;' 的模板参数

错误 15 错误 C2784: 'bool std::operator &lt;(const std::vector&lt;_Ty,_Alloc&gt; &amp;,const std::vector&lt;_Ty,_Alloc&gt; &amp;)' : 无法从 'const skl::Bone' c:\Program Files\Microsoft Visual Studio 9.0\VC\include\utility 103 推断出 'const std::vector&lt;_Ty,_Alloc&gt; &amp;' 的模板参数

错误 16 错误 C2784: 'bool std::operator &lt;(const std::list&lt;_Ty,_Ax&gt; &amp;,const std::list&lt;_Ty,_Ax&gt; &amp;)' : 无法从 'const skl::Bone' c:\Program Files\Microsoft Visual Studio 9.0\VC\include\utility 103 推断出 'const std::list&lt;_Ty,_Ax&gt; &amp;' 的模板参数

错误 17 错误 C2784: 'bool std::operator &lt;(const std::reverse_iterator&lt;_RanIt&gt; &amp;,const std::reverse_iterator&lt;_RanIt2&gt; &amp;)' : 无法从 'const skl::Bone' c:\Program Files\Microsoft Visual Studio 9.0\VC\include\utility 103 推断出 'const std::reverse_iterator&lt;_RanIt&gt; &amp;' 的模板参数

错误 18 错误 C2784: 'bool std::operator &lt;(const std::_Revranit&lt;_RanIt,_Base&gt; &amp;,const std::_Revranit&lt;_RanIt2,_Base2&gt; &amp;)' : 无法从 'const skl::Bone' c:\Program Files\Microsoft Visual Studio 9.0\VC\include\utility 103 推断出 'const std::_Revranit&lt;_RanIt,_Base&gt; &amp;' 的模板参数

错误 19 错误 C2784: 'bool std::operator &lt;(const std::pair&lt;_Ty1,_Ty2&gt; &amp;,const std::pair&lt;_Ty1,_Ty2&gt; &amp;)' : 无法从 'const skl::Bone' c:\Program Files\Microsoft Visual Studio 9.0\VC\include\utility 103 推断出 'const std::pair&lt;_Ty1,_Ty2&gt; &amp;' 的模板参数

错误 20 错误 C2676: 二进制 '&lt;' : 'const skl::Bone' 未定义此运算符或转换为预定义运算符可接受的类型 c:\Program Files\Microsoft Visual Studio 9.0\VC\include\utility 103

【问题讨论】:

    标签: c++ algorithm vector


    【解决方案1】:

    您为什么希望它按int 排序?任何container&lt;T&gt; 都按T 排序,并且排序要求对T 进行小于比较。现在对于pair&lt;S,T&gt;,有一个operator&lt;,定义为字典顺序,但这需要ST 的可比性:

    // lexicographic compare:
    bool operator<(pair<S,T> a, pair<S,T> b)
    {
      return a.first < b. first || (!(b.first < a.first) && (a.second < b.second));
      //                                                    ^^^^^^^^^^^^^^^^^^^^^^^
    } //                                                     compare second type!
    

    递归向下移动,您需要 Bone 小于可比。请检查一下,您没有为该类型实现比较运算符的任何赌注!

    编辑:根据您的更新,这正是您的问题。

    备注:您可能想知道为什么字典比较是默认值:这是唯一合理的比较,!(x &lt; y) &amp;&amp; !(y &lt; x)x == y 相同,前提是这两种子类型分别适用。

    更新:如果你只想按第一个成员排序,你应该编写一个自定义比较器谓词,或者使用多映射。

    自定义比较器:

    template <typename S, typename T>
    bool PairCompareOnlyFirst(const std::pair<S,T> & a, const std::pair<S,T> & b)
    {
      return a.first < b.first;
    }
    
    std::sort(v.begin(), v.end(), PairCompareOnlyFirst);
    

    请注意,sort 可能会重新排列具有相同键的元素。如果您希望它们保持相对顺序,请改用stable_sort

    多图:

    typedef std::multimap<int, std::pair<Bone,std::string> > myMapType;
    

    multimap 是一个比向量更复杂的结构,它的元素总是按键值排序,即你的int。哪个更可取取决于您在做什么。

    【讨论】:

    • 我只想按第一个 int 排序
    • @Milo:更新来回答这个问题。
    【解决方案2】:

    没有看到错误我不能确定这一点,但需要注意的一点是 std::pair 不只是按第一个值排序;如果需要,它还会使用第二个值来打破关系。在 std::map 的上下文中,这不是问题,因为地图在内部使用自定义比较器而不是默认运算符

    因此,如果你没有为 Bone 定义 operator

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-03
      • 2011-06-04
      • 2011-02-18
      • 2021-03-19
      • 2013-08-18
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多