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

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

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

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

Q&A

解決済

2回答

6692閲覧

std::mapの文字列キーを格納したstd::vectorをソートする

Seiten_Minagawa

総合スコア58

C++

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

0グッド

0クリップ

投稿2017/11/09 10:41

###前提・実現したいこと
文字列のキーと構造体の値を持つstd::mapとキーを格納したstd::vectorがあり、std::mapのキーに対応する値の1つのメンバ変数をもとにキーを格納したstd::vectorをソートしたい。

###コード

#include <vector> #include <map> #include <string> #include <algorithm> using namespace std; struct Person { string name; unsigned int age; }; int main() { //値はすでに格納されているものとする map<string, Person> person_map; vector<string> person_key; //sortobjectの部分をどうするか? sort(person_key.begin(), person_key.end(), sortobject); //最も若い人物の名前を表示する cout << person_map[person_key[0]].name.c_str() << '(' << person_map[person_key[0]].age << ')' << endl; return 0; }

###補足情報(言語/FW/ツール等のバージョンなど)
Visual Studio Community 2017を使用。言語はC++。

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

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

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

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

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

guest

回答2

0

ベストアンサー

person_keyにperson_mapのキーの一部が入っていて、そのキーをageの小さい順に並び変えたいってことですね?
こんな感じでしょうか。

C++

1sort(person_key.begin(), person_key.end(), [&](const auto& lhs, const auto& rhs) { 2 const auto& lv = person_map[lhs]; 3 const auto& rv = person_map[rhs]; 4 if (lv.age == rv.age) { 5 return lv.name.compare(rv.name) < 0; 6 } 7 return lv.age < rv.age; 8});

ラムダ式の[&]でperson_mapを参照キャプチャしておくのがポイントです。
(=でもいいけどコピーしちゃうので)

投稿2017/11/09 12:45

toki_td

総合スコア2850

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

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

0

二度手間感がすごいですが、こんな感じでしょうか。

C++

1#include <array> 2#include <vector> 3#include <map> 4#include <string> 5 6#include <algorithm> 7#include <iostream> 8 9struct Person { 10 std::string name; 11 unsigned int age; 12}; 13 14int main(void) { 15 // 16 // Prepare data 17 std::array<Person, 4> arr{ 18 {{"Yamada", 25u}, {"Suzuki", 63u}, {"Tanaka", 35u}, {"Takahashi", 18u}} 19 }; 20 21 std::vector<std::string> person_key; person_key.reserve(arr.size()); 22 std::map<std::string, Person> person_map; 23 for(auto&& elem: arr) { 24 person_key.emplace_back(elem.name); 25 person_map[elem.name] = std::move(elem); 26 } 27 28 // 29 // Sort 30 auto compare = [&person_map](const std::string& p1, const std::string& p2) { 31 return person_map[p1].age < person_map[p2].age; 32 }; 33 std::sort(person_key.begin(), person_key.end(), compare); 34 35 for(const auto& elem: person_key) { 36 std::cout << person_map[elem].age << ": " << elem << "\n"; 37 } 38 std::cout << std::endl; 39 40 return 0; 41}

出力

18: Takahashi 25: Yamada 35: Tanaka 63: Suzuki

やっぱC++難しいですね...
おそらく良くない点があると思います、ご指摘をいただけると幸いです。

投稿2017/11/09 12:43

LouiS0616

総合スコア35658

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問