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

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

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

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

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

Q&A

解決済

1回答

2118閲覧

cpplinqにstd::mapを流した際に返す値について

nkkn1446

総合スコア10

C++

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

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

0グッド

0クリップ

投稿2015/12/11 00:16

c++

1std::vector<int> vec = {5,10}; 2int arr[] = {5,10}; 3std::map<std::string, int> ma = {{"Hoge",5},{"Fuga",10}}; 4 5from(vec) >> /*ほんとはごにょごにょ*/ to_vector(); // {5,10} 6from_array(arr) >> /*ごにょごにょ*/ to_vector(); // {5,10} 7from(ma) >> /*ごにょごにょ*/ to_map([](auto result){return result.frist;}); // {{"Hoge",{"Hoge",5}},{"Fuga",{"Fuga",10}}}

上記のようにcpplinqにstlコンテナを渡して何かしらの処理(今やりたいのはjoin)の後

受け取ろうとすると、vectorや配列はvector<int>を返すのに対して

mapはmap<string, pair<string, int>>のコンテナを返してしまいます。

これをmap<string, int>の形式で受け取りたい場合の対処ってないものでしょうか?

ご回答よろしくお願いしますm(_ _)m

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。外していたらすいません。

ここをみると「クエリ式」のパラメータへコンテナの要素の型を渡すようです。また、result.firstでは期待通りに返却されないような気がします。

to_map([](auto result){return result.frist;})

ではなく、

to_map([](const pair<const std::string, int>& result){return result;})

の方が確実な気がします。

投稿2015/12/11 01:13

編集2015/12/11 01:17
Chironian

総合スコア23272

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

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

nkkn1446

2015/12/11 12:28 編集

こんにちは。ご回答ありがとうございます。 教えていただいた方法を試してみました。 結果としてはmap<pair<string, int>, pair<string, int>>という形式になってしまいました...。 to_map()関数は生成されるmapのkeyとvalueのペアを得るためのものですが、引数の値がvalueにされてしまう(今回はpair<string, int>)ため↑の挙動になってしまうようです。
Chironian

2015/12/11 15:24

なるほど。to_map()に渡すラムダ式のパラメータが値となり、戻り値がキーになるわけですね。 ということは、map<string, int>を作るためには、intを受け取ってstringを返却するラムダ式を渡すしかないですね。そのためには、from()にint列を渡すしかないように思います。 ラムダ式を渡せるのならファンクタも渡せますね? そうであれば、from()にはintのvectorを渡し、maと「intを受け取りma内の対応するstringを返却するoperator()」を持つファンクタをto_map()へ渡せばできるように思います。 あまり意味が無い気もしますが。 しかし、そもそもキー付きコンテナを渡してキーと値を分けてハンドリングする機能をcpplinqが持ってないと無理な気がします。 from_map()みたいなものはないですか?
nkkn1446

2015/12/12 07:52

>しかし、そもそもキー付きコンテナを渡してキーと値を分けてハンドリングする機能をcpplinqが持ってないと無理な気がします。 from_map()みたいなものはないですか? ご指摘の通りcpplinqではmapコンテナを渡してもpairの配列としてしか解釈できないようです(from_map()もありませんでした) ただ、回答の内容をヒントに以下のようにしたところ期待した挙動になりました! std::map<std::string, int> ma2; from(ma) >> for_each([&ma2](const std::pair<const std::string, int>& result){ma2.insert(result);}); 冗長気味ですし、本来のfor_eachの用途は各要素に一定の処理を加えるものですが 今回はよしとします。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問