std :: vector <std :: pair <int,std :: pair <bone,std :: string>&gt; &GT;不按int排序?</std :: pair <int,std :: pair <bone,std :: string>

时间:2011-08-18 00:38:16

标签: 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());

错误:

  

错误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

2 个答案:

答案 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 == ytemplate <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模板后报告错误。

希望这有帮助!