質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

3066閲覧

C++ mapの値ソートもしくは2次元vectorの参照方法

opyon

総合スコア1009

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/10/21 12:16

※質問が分かりにくいようでしたら編集しますのでご指摘願います。

###現状
ある集計処理をしていた時のことです。
当初2次元配列ぽいvectorを用意して処理しようとしていました。
サンプルコードの例ですとaの要素に+10する部分です。
自分がまだ知らないだけなのかもしれないですが冗長になりそうなので、
mapで集計させて最後にvectorに移し替えて降順ソートして出力するようにしました。

###知りたいこと
mapの値でソートしたい時にはどうしたら良いでしょうか?
また、vectorでも良いのですがpairを使った2次元配列のようなものでmapのようにキー指定してaの値を+10するなどの2次元vectorを参照する簡易な方法があれば知りたいです。

###検索で参考にしたもの
「ソートも、サーチも、あるんだよ」
~標準C++ライブラリにみるアルゴリズムの面白さ

上記は@Zuishinさんの回答からのリンクです

サンプルコード

C++

1#include <cstdio> 2#include <iostream> 3#include <iterator> 4#include <vector> 5#include <string> 6#include <algorithm> 7#include <map> 8 9int main() 10{ 11 std::map<std::string, int> map1; 12 13 //集計処理 14 map1["a"] = 0; 15 map1["b"] = 0; 16 map1["c"] = 0; 17 18 map1["a"] += 1; 19 map1["b"] += 2; 20 map1["c"] += 3; 21 22 map1["a"] += 10; 23 map1["b"] += 200; 24 map1["c"] += 30; 25 26 //vectorへ変換 27 struct data 28 { 29 std::string name; 30 int price; 31 }; 32 std::vector<data> d; 33 34 for (auto itr = map1.begin(); itr != map1.end(); ++itr) 35 { 36 d.push_back({itr->first, itr->second}); 37 } 38 39 //降順ソート 40 sort(d.begin(), d.end(), [](const data &x, const data &y) { return x.price > y.price; }); 41 42 //名前出力 43 for (data x : d) 44 { 45 std::cout << x.name << " "; 46 } 47 48 return 0; 49} 50 51// 出力結果 52// b c a

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

mapの値でソートしたい時にはどうしたら良いでしょうか?

map はキーでソートされており、値でソートするようなことはできないです。

2次元vectorを参照する簡易な方法があれば知りたいです。

std::vector<data> という配列で最初から数える場合、std::find_if() でキーが一致する要素を線形探索 (0個目の要素から順番にチェックしていく) する必要があるので、要素の数が増えると遅くなってしまいます。

数えるのがアスキー文字だけであれば、長さ 255 の配列を確保しておいて、'a' の場合、index 97 をカウントアップのようにする手もあります。
アスキーコード

std::cout << int('a') << std::endl; // 97 std::vector<int> counts(255); counts[int('a')]++;

投稿2018/10/21 13:57

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

opyon

2018/10/21 14:32 編集

回答ありがとうございます。 >map はキーでソートされており、値でソートするようなことはできないです。 やはりそうでしたか。ハッキリ分かって安心しました。 >キーが一致する要素を線形探索 (0個目の要素から順番にチェックしていく) する必要がある こちらもですか。 >数えるのがアスキー文字だけであれば、 (1文字では無いケースやASCII文字以外を含む場合があると) 逆に冗長になりそうなのでどこかで使える機会があればと思います。 補足 質問用にサンプル作ったのですが、今後似たような処理が必要になった時に簡易な参照方法があればと思った次第です。 今回のように計算処理はmapを使い(キーで参照するのが楽なので)、その後vectorに移してソートする方法が今のところ私の思いつく最善の気がします。 慣れだとは思いますが他言語ではmapの値でのソートが出来るのにC++ではこれに限らず思うように出来ないことが多く調べるのに苦労しています^^;
tiitoi

2018/10/21 14:37 編集

Python と比べると多少手間がかかるのはしょうがないですね。 > 今回のように計算処理はmapを使い(キーで参照するのが楽なので)、その後vectorに移してソートする方法が今のところ私の思いつく最善の気がします。 自分もそう思います。
opyon

2018/10/21 14:43

ありがとうございます。 @tiitoiさんにお墨付きを頂いたようで安心しました^^ 基本操作だけの浅い学習しかしてませんが Java→Python3→C++とやってみて思った感想はPython3めっちゃ楽でした ただPython3は速度が遅いとのことだったので速さを追求するならC++だなと思いました。 Cは更に難しそうだったので早々にC++に絞って勉強してみるつもりです。
yumetodo

2018/10/21 14:52

補足するとstd::mapよりは普通std::unorded_mapを使うべきじゃないかなと思います。
opyon

2018/10/21 14:55

コメントありがとうございます。 そうですねunorded_mapの方が速いとのことなので普段はそうするつもりなのですが、質問用サンプルコードなので少しでも見やすいほうが良いかなと思いまして。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問