2011-08-18 136 views
2

我有一個std::vector<std::pair<int,std::pair<Bone,std::string> > >std :: vector <std :: pair <int,std :: pair <bone,std :: string> >>不按int整理?

我試圖將其與性病排序排序,並期望它是由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 *)':\ Program Files文件\微軟的Visual Studio 9.0 \ VC \:無法從'const skl::Bone'ç推斷模板參數爲'const std::basic_string<_Elem,_Traits,_Alloc> &' include \ utility 102

錯誤2錯誤C2784:'bool std::operator <(const _Elem *,const std::basic_string<_Elem,_Traits,_Alloc> &)':無法推導出的模板參數210 'const skl::Bone' C:\ Program Files文件\微軟的Visual Studio 9.0 \ VC \包括\工具102

錯誤3錯誤C2784:'bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const std::basic_string<_Elem,_Traits,_Alloc> &)':\ Program Files文件\微軟的Visual Studio 9.0:無法從'const skl::Bone'ç推斷模板參數爲'const std::basic_string<_Elem,_Traits,_Alloc> &' \ VC \包括\工具102

錯誤4錯誤C2784:'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)':無法從'const skl::Bone'ç推斷模板參數爲'const std::_Tree<_Traits> &':\ Program Files文件\微軟的Visual Studio 9.0 \ VC \包括\工具102

錯誤5錯誤C2784:'bool std::operator <(const std::vector<_Ty,_Alloc> &,const std::vector<_Ty,_Alloc> &)':不能從'const skl::Bone'ç推導出'const std::vector<_Ty,_Alloc> &'模板參數:\ Program Files文件\微軟的Visual Studio 9.0 \ VC \包括\工具102

錯誤6錯誤C2784:'bool std::operator <(const std::list<_Ty,_Ax> &,const std::list<_Ty,_Ax> &)':\ Program Files文件\:無法從'const skl::Bone'ç推斷爲'const std::list<_Ty,_Ax> &'模板參數微軟的Visual Studio 9.0 \ VC \包括\工具102

錯誤7錯誤C2784:'bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)':無法從'const skl::Bone'ç推斷模板參數爲'const std::reverse_iterator<_RanIt> &':\ Program Files文件\微軟的Visual Studio 9.0 \ VC \包括\工具102

錯誤8錯誤C2784: 'bool std::operator <(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)':無法從'const skl::Bone'Ç推導出'const std::_Revranit<_RanIt,_Base> &'模板參數:\ Program Files文件\微軟的Visual Studio 9.0 \ VC \包括\工具102

錯誤9錯誤C2784:'bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)':不能爲'const std::pair<_Ty1,_Ty2> &''const skl::Bone'ç推斷模板參數: \程序Files \ Microsoft的Visual Studio 9.0 \ VC \包括\效用102

錯誤10錯誤C2676:二進制'<''const skl::Bone'沒有定義這個操作符或轉換到類型接受的預定義的運算符C:\ Program Files文件\微軟的Visual Studio 9.0 \ VC \包括\設施10

錯誤11錯誤C2784:'bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const _Elem *)':無法從'const skl::Bone'Ç推導出'const std::basic_string<_Elem,_Traits,_Alloc> &'模板參數:\ Program Files文件\微軟的Visual Studio 9。0 \ VC \包括\工具103

錯誤12錯誤C2784:'bool std::operator <(const _Elem *,const std::basic_string<_Elem,_Traits,_Alloc> &)':無法從'const skl::Bone'ç推斷模板參數爲'const _Elem *':\ Program Files文件\微軟的Visual Studio 9.0 \ VC \包括\工具103

錯誤13錯誤C2784:'bool std::operator <(const std::basic_string<_Elem,_Traits,_Alloc> &,const std::basic_string<_Elem,_Traits,_Alloc> &)':無法從'const skl::Bone'推斷模板參數爲'const std::basic_string<_Elem,_Traits,_Alloc> &' C:\ Program Files文件\微軟的Visual Studio 9.0 \ VC \包括\工具103

錯誤14錯誤C2784:'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)':不能推導出模板參數爲'const std::_Tree<_Traits> &''const skl::Bone'個C:\ Program Files文件\微軟的Visual Studio 9.0 \ VC \包括\工具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文件\微軟的Visual Studio 9.0 \ VC \包括\工具103

錯誤16錯誤C2784:'bool std::operator <(const std::list<_Ty,_Ax> &,const std::list<_Ty,_Ax> &)':無法從'const skl::Bone'ç推斷模板參數爲'const std::list<_Ty,_Ax> &':\ Program Files文件\微軟的Visual Studio 9.0 \ VC \包括\工具103

錯誤17錯誤C2784 :'bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)':無法推導的模板參數從'const skl::Bone' C:\ Program Files文件\微軟的Visual Studio 9.0 \ VC \包括\工具103

錯誤18錯誤C2784:'bool std::operator <(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)':\ Program Files文件\微軟的Visual Studio 9.0:無法從'const skl::Bone'ç推斷模板參數爲'const std::_Revranit<_RanIt,_Base> &' \ VC \包括\工具103

錯誤19錯誤C2784:'bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)':無法從'const skl::Bone'ç推斷模板參數爲'const std::pair<_Ty1,_Ty2> &':\ Program Files文件\微軟的Visual Studio 9.0 \ VC \包括\工具103

錯誤20錯誤C2676:二進制'<''const skl::Bone'沒有定義此運算符或轉換到類型接受的預定義運算C:爲什麼你會希望它通過int進行排序\ Program Files文件\微軟的Visual Studio 9.0 \ VC \包括\工具103

回答

11

?任何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! 

向下移動遞歸,你需要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

Multimap之:

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

的多重映射比該載體的更復雜的結構,並且其元素始終由密鑰值保持有序,即你的int。哪一個更好取決於你在做什麼。

+0

我只是想按第一個整數排序 – jmasterx

+0

@Milo:更新回答。 –

1

沒有看到錯誤我不能確定這一點,但有一點需要注意的是,std :: pair不僅僅是按第一個值排序;它還使用第二個值來打破關係。在std :: map的情況下,這不是問題,因爲內部映射使用自定義比較器而不是默認運算符<,但如果自然排序對,排序可能會考慮第二個元素。因此,如果您沒有爲Bone定義運算符<,您將收到編譯器錯誤,因爲對運算符<的模板代碼將嘗試使用它。最重要的是,你會得到一些兇猛的編譯器錯誤,因爲編譯器只會在實例化模板進行排序和配對後才報告錯誤。

希望這會有所幫助!

相關問題