2017-03-18 3 views
0

マップを値でソートしようとしています。私はそれを行う方法についての研究を行い、次のコードで終わった。しかし、それはコンパイルされませんし、なぜ私は確信していません。関数を使用して値でマップをソートできないのはなぜですか?

#include <iostream> 
#include <map> 
#include <algorithm> 
#include <iterator> 
using namespace std; 

bool cmp(pair<int,int> const & a, pair<int,int> const & b) 
{ 
    return a.second != b.second? a.second < b.second : a.first < b.first; 
} 

int main() 
{ 
map<int,int>myMap; 
for(int i=0,j=10;i<10;i++,j--) 
{ 
    myMap.emplace(i,j); 
} 
for(map<int,int>::iterator it=myMap.begin();it!=myMap.end();it++) 
{ 
    cout << it->first << " " << it->second << endl; 
} 

sort(myMap.begin(),myMap.end(),cmp); 

for(map<int,int>::iterator it=myMap.begin();it!=myMap.end();it++) 
{ 
    cout << it->first << " " << it->second << endl; 
} 
    return 0; 
} 
+0

私たちとコンパイルエラーを共有してください。 –

+0

かなり長いですが大丈夫です。私はそれを追加させてください。編集:私のポストは主にコードなので、いくつかの詳細を追加するように頼んでいます。それは意味をなさない。 @RichardCritten – zeke

+3

'std :: map'は常にキーでソートされます。最初にペアのリストに変換してからソートリストに変換する必要があります – myaut

答えて

1

std::mapは常にキーでソートされます。最初にペアのリストに変換してからリストをソートする必要があります。これはといえば、std::sortそのプロトタイプに係るランダム反復子が必要:

template< class RandomIt > 
void sort(RandomIt first, RandomIt last); 

ランダムイテレータはstd::sort(すなわち要素1および3を交換するための)任意のインデックスにある要素にアクセスすることができなければならないことを意味します。ただし、索引アクセスは索引ではなくキーによってアクセスされるため、マップに対する意味はありません。

例:

std::list<std::map<int,int>::value_type> list; 
std::copy(myMap.begin(), myMap.end(), std::back_inserter(list)); 
list.sort(cmp); 
+0

参照してください。この場合、 'map :: iterator'は双方向です。したがって、エラー。 – zeke

+0

'std :: list'である必要はありません。これは 'std :: vector'でもかまいません。この場合、' std :: find'が使われます。 –

1

エラーの別の(技術的)原因は、(それはさておき、それは意味論的に無意味であると@myautが言ったように、そのマップ反復子は、ランダムではない)map(及びunordered_map)であり、基礎となります値の型。あなたの場合は実際にはstd::pair<const int, int>です。だから、:

  • あなたの比較関数がそれを受け入れることはありません
  • あなたはそれを修正する場合でも、sortがそれらを割り当て、周りに値を移動しようとします(それが間違った型への参照をバインドしようとします)。また、const変数に割り当てることはできません
関連する問題