std :: vector <std :: pair <int,std :: pair <Bone,std :: string >>>不按int排序?

jma*_*erx 2 c++ algorithm vector

我有一个 std::vector<std::pair<int,std::pair<Bone,std::string> > >

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

可能有什么不对?

码:

std::vector<std::pair<int,std::pair<Bone,std::string> > > tempBones;
std::sort(tempBones.begin(),tempBones.end());
Run Code Online (Sandbox Code Playgroud)

错误:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ker*_* SB 11

你为什么期望它被排序int?任何container<T>按排序T,排序要求有一个小于比较T.现在pair<S,T>,有一个operator<定义为字典顺序,但这需要双方的可比性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!
Run Code Online (Sandbox Code Playgroud)

递归地向下移动,你需要Bone低于可比性.请检查,您没有为该类型实施比较运算符的任何赌注!

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

备注:您可能奇怪为什么字典比较是默认的:它是唯一明智的比较这!(x < y) && !(y < 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);
Run Code Online (Sandbox Code Playgroud)

请注意,sort可以使用相同的键重新排列元素.如果您希望那些保持相对排序,请stable_sort改用.

Multimap之:

typedef std::multimap<int, std::pair<Bone,std::string> > myMapType;
Run Code Online (Sandbox Code Playgroud)

在多重映射大于矢量更复杂的结构,它的元素,始终保持由键值排序顺序,即你的int.哪一个更好取决于你正在做什么.