2017-10-24 27 views
-1

先週私はCatalysts Coding Contestに参加しましたが、今ではよりハイレベルのC++でタスクを再作成しようとしています。だから私はstd::unordered_mapをキー値としてstd::stringとマッピングされたタイプとしてdoubleとすることに決めました。unordered_mapとstd :: stringを辞書順に並べ替え

データは次のようになります。上の

N0 1.23 
N1 2.45 

ので。

今問題は、私は文字列でこれを並べ替えることです。しかし、それは常に1 < 3ので

N3 1.23 
N10 4.56 

のような大きな数字を並べ替えしようと、それはそれを文字の文字を比較したとき台無し。今私はすでにstd::sort関数を試しましたが、私は実際にどのように3番目のパラメータが動作するのか分かりません。

誰かが私に説明することができますか、これを解決する手がかりがあります。ここ

は、関連するソースコードである:

std::unordered_map <std::string, unsigned int> network; 
unsigned int network_power = 1234; 
std::unordered_map <std::string, double> network_percent; 

for (std::pair<std::string, unsigned int> element : network) { 
    double x = ((double)element.second/(double)network_power) * 100; 
    x = (int)(x * 100 + 0.5)/100.0; 

    network_percent.insert({element.first, x}); 
} 

端ではなければならない昇順に出力network_percentの各要素。事前に

おかげ フィリップ

PS:私はすでにStackOverflowの上の他の記事を見つけましたが、それらを理解していません。

EDIT:申し訳ありませんが、これを書いたのは遅かったです。

次のようになりますまで、コードは私が得たソートする:ピーター・ベッカーは、私はそれが非辞書式順序でそれをソートしたいと述べたよう

std::sort(network_percent.begin(), network_percent.end()); 

。私が得たときにデータが好き:キー以上の1桁を持ったときに、それが台無しに現時点で

N0 218 
N1 92 
N2 296 
N3 69 
N4 135 
N5 68 
N6 157 
N7 106 
N8 74 
N9 309 
N12 576 

N1 92 
N9 309 
N2 296 
N7 106 
N0 218 
N3 69 
N4 135 
N5 68 
N6 157 
N8 74 
N12 576 

が、私はそれのようにソートします。私の質問です:それは私が望むようにそれをソート機能がありますか?

+4

ここに示したコードは、何も並べ替えを試みていないようです。キーと値のペアをソートしようとした特定のコードを投稿できますか? – templatetypedef

+0

N10は辞書順にN3の前にあります。あなたが望むのは、**辞書編集的なものではないものです。 'std :: set'の比較関数を書くことができますが、まずその関数が何をすべきかを**正確に**記述する必要があります。 2つか3つのサンプル値を与えることはそれをしません。 –

答えて

0

順序付けされていないセットとマップは何も並べ替えません。それらは、キーのoperator==にのみ依存するハッシュされたコンテナです(同じハッシュを持つすべてのキーは、バケットと呼ばれる何らかの種類の内部リストまたはベクトルに保存されます)。キーに与えられた順序は指定されていません。

ハッシュコンテナは、コンテナ内に何かがあってもソートされていないと、見つけ出すのが非常に高速です。並べ替えを行う場合は、std::mapの場合はnetwork_percentの型を置き換える必要があります。

は、辞書順に従って実装されているため、意図的な動作を得るために他に何もする必要はありません。

注:unordered_mapunorderedと呼ばれる理由に気づいていませんか? :)