我有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());
错误:
错误1错误C2784:
'bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *)'
:无法从'const std::basic_string<_Elem,_Traits,_Alloc> &'
c推出'const skl::Bone'
的模板参数:\ 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 *'
c推出'const skl::Bone'
的模板参数:\ 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> &'
c推出'const skl::Bone'
的模板参数:\ 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> &'
c推出'const skl::Bone'
的模板参数:\ 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> &'
c推出'const skl::Bone'
的模板参数:\ 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> &'
c推出'const skl::Bone'
的模板参数:\ 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> &'
c推出'const skl::Bone'
的模板参数:\ 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> &'
c推出'const skl::Bone'
的模板参数:\ 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> &'
c推出'const skl::Bone'
的模板参数:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 102错误10错误C2676:二进制
'<'
:'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> &'
c:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 103中推断'const skl::Bone'
的模板参数错误12错误C2784:
'bool std::operator <(const _Elem *,const std::basic_string<_Elem,_Traits,_Alloc> &)'
:无法从'const _Elem *'
c:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 103中推断'const skl::Bone'
的模板参数错误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> &'
c:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 103中推断'const skl::Bone'
的模板参数错误14错误C2784:
'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)'
:无法从'const std::_Tree<_Traits> &'
c:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 103中推断'const skl::Bone'
的模板参数错误15错误C2784:
'bool std::operator <(const std::vector<_Ty,_Alloc> &,const std::vector<_Ty,_Alloc> &)'
:无法从'const std::vector<_Ty,_Alloc> &'
c:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 103中推断'const skl::Bone'
的模板参数错误16错误C2784:
'bool std::operator <(const std::list<_Ty,_Ax> &,const std::list<_Ty,_Ax> &)'
:无法从'const std::list<_Ty,_Ax> &'
c:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 103中推断'const skl::Bone'
的模板参数错误17错误C2784:
'bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)'
:无法从'const std::reverse_iterator<_RanIt> &'
c:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 103中推断'const skl::Bone'
的模板参数错误18错误C2784:
'bool std::operator <(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)'
:无法从'const std::_Revranit<_RanIt,_Base> &'
c:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 103中推断'const skl::Bone'
的模板参数错误19错误C2784:
'bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)'
:无法从'const std::pair<_Ty1,_Ty2> &'
c推出'const skl::Bone'
的模板参数:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include \ utility 103错误20错误C2676:二进制
'<'
:'const skl::Bone'
未定义此运算符或转换为预定义运算符c:\ Program Files \ Microsoft Visual Studio 9.0 \ VC \ include可接受的类型\ utility 103
答案 0 :(得分: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!
的可比性:
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);
相同的唯一合理比较,前提是两个子句相同 - 单独的。
更新:如果您只想要第一个成员订购,您应该编写自定义比较器谓词,或者使用多地图。
自定义比较器:
sort
请注意stable_sort
可能会使用相同的键重新排列元素。如果您希望这些维护其相对排序,请改用typedef std::multimap<int, std::pair<Bone,std::string> > myMapType;
。
Multimap之:
int
multimap是一个比vector更复杂的结构,它的元素总是按键值排序,即你的{{1}}。哪一个更好取决于你正在做什么。
答案 1 :(得分:1)
没有看到错误我无法确定这一点,但有一点需要注意的是std :: pair不只是按第一个值排序;如果需要打破关系,它也会使用第二个值。在std :: map的上下文中,这不是问题,因为内部地图使用自定义比较器而不是默认运算符&lt;,但如果您自然地排序对,则排序可能会考虑第二个元素。
因此,如果你没有定义运算符&lt;对于Bone,你会得到编译器错误,因为对的运算符的模板代码&lt;会尝试使用它。最重要的是,你会得到一些关于它的凶猛编译器错误,因为编译器只会在实例化sort和pair模板后报告错误。
希望这有帮助!