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<定义为字典顺序,但这需要双方的可比性S和T:
// 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.哪一个更好取决于你正在做什么.