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

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

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

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

Q&A

解決済

5回答

3253閲覧

型の違う(X,Y)の組みの配列を作り、それを小さい順に並び替えたい

kanka

総合スコア26

C++

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

0グッド

0クリップ

投稿2018/10/16 20:04

編集2018/10/17 02:53

補足
解答欄に補足を書いてしまったので、こちらでも質問内容を訂正します。
(int X,double Y)の組の配列を作り、Yの大きさ順にこの配列をソートしたいです。
どうすれば良いでしょうか?おねがいいたします。

-----以下、最初に書いた質問---

vectorで異なるデータ型のものを入れることはできますか?

C++

1#include<vector> 2using namespace std; 3 4int main(void){ 5 vector<vector<int>> vv; 6 double a[0.1,0.6,0.4]; 7 for(int i=0;i<3;i++){ 8 vv.pushback({i,a[i]});//ここで型の違いでエラーが起きます。 9 } 10}

この問題を解決する方法はありますか? 事情で、できるだけvectorを使いたいです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答5

0

ベストアンサー

(int X,double Y)の組の配列を作り、Yの大きさ順にこの配列をソートしたいです。

素直に実装すると下記コードのようになります。(int X,double Y)の組は構造体Data型で定義しています。(std::pairstd::tupleを使うという手もありますが、X,Yのように明確な名前を付けられるなら、そのまま構造体を定義したほうがよいです。)

C++

1#include <vector> 2#include <iostream> 3#include <algorithm> 4 5struct Data { 6 int x; 7 double y; 8}; 9 10int main() 11{ 12 // {X,Y}の組の配列(vector) 13 std::vector<Data> vv; 14 15 double a[] = { 0.1, 0.6, 0.4 }; 16 for (int i = 0; i < 3; i++) { 17 // {x,y}ペアを配列に追加 18 vv.push_back({i, a[i]}); 19 } 20 21 for (const auto& e: vv) { 22 std::cout << "{" << e.x << ", " << e.y << "}\n"; 23 } 24 std::cout << "----" << std::endl; 25 26 // Yをキーに昇順ソート 27 std::sort(vv.begin(), vv.end(), [](const auto& a, const auto& b) { 28 return a.y < b.y; 29 }); 30 31 for (const auto& e: vv) { 32 std::cout << "{" << e.x << ", " << e.y << "}" << std::endl; 33 } 34}

https://wandbox.org/permlink/0ZGdzZj5BQcxlEAx

投稿2018/10/17 06:47

yohhoy

総合スコア6191

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

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

kanka

2018/10/17 09:40

ありがとうございます。 sort(vv.begin(), vv.end(), [](const auto& a, const auto& b) { return a.y < b.y; }); は何をやっているのでしょうか? ラムダ式というキーワードまではたどり着いたのですがわかりませんでした。
episteme

2018/10/17 12:46

そのlambda式がふたつの要素を比較する関数となり、それで与えられた比較関数に基づいて昇順にソートしてくれます。
kanka

2018/10/23 13:09 編集

ありがとうございます! うまくいきました
guest

0

std::any案件かと思ったけど
普通にstructでいいですね。

c++17以降専用

c++

1#include <iostream> 2#include <vector> 3#include <any> 4using std::cout, std::endl; 5using std::vector, std::any, std::any_cast; 6 7struct values{ 8 int X; 9 double Y; 10 values(int X, double Y); 11}; 12values::values(int x, double y) : X(x), Y(y){} 13 14int main(){ 15 vector<values> vv1; 16 vector<vector<any>> vv2; 17 double a[]{0.1,0.6,0.4}; 18 int i = 0; 19 for(const auto x : a){ 20 vv1.emplace_back(i, x); 21 vv2.push_back({i, x}); 22 i++; 23 } 24 cout << "vv1["; 25 for(auto&& x : vv1){ 26 cout << "{" << x.X << "," << x.Y << "}"; 27 } 28 cout << "]" << endl; 29 cout << "vv2["; 30 for(auto&& x : vv2){ 31 cout << "{" << any_cast<int>(x[0]) << "," << any_cast<double>(x[1]) << "}"; 32 } 33 cout << "]" << endl; 34} 35

投稿2018/10/16 22:28

編集2018/10/16 22:31
asm

総合スコア15147

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

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

kanka

2018/10/17 15:10

当方c++11のコンパイラを利用しているのでyohhoyさんの方法で実装させていただきました。 c++17の仕様かもしれませんが、<any>で構造体を即席できる点など勉強になるところが多かったです! コンパイラをc++17にアップデートしたい欲が高まってきました...! ありがとうございます
guest

0

こんにちは。

追記を見る限り、それはstd::vectorではないですよ。std::mapを使うのがよさそうです。
配列で要素を指定するものはindex番号ですから、常に整数です。1次元だろうが2次元だろうが配列のインデックスに double 型を使うことはないですよね? それと同じなのですよ。

ところで、追記は質問文を編集しましょう。

投稿2018/10/17 01:35

Chironian

総合スコア23272

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

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

kanka

2018/10/17 09:45

ありがとうございます。 mapについて調べてみました。作った配列をキーじゃない方の中身でソートしたい用事があったので、今回はmapじゃないほうがいいと思いました。 mapを調べたら便利なデータ型だということがわかったので、勉強になりました。ありがとうございます!
Chironian

2018/10/17 10:00

ソートしたいものをキーに指定するだけですよ。 でも、yohhoyさんが書かれている方法の方が理解しやすいだろうと思います。std::mapは意外にハマりポイントも多いですし。
kanka

2018/10/17 12:04 編集

言われてみれば、、、! mapでも作れるようになりたいので勉強します。ありがとうございます
guest

0

union(共用体)はダメですか?
共用体

投稿2018/10/16 20:15

cateye

総合スコア6851

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

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

0

追記
すみません。詳しく説明します。
型の違うデータを一つの二次元配列(X,Y)に入れて、
Y(double)の大きさでX(int)の順番をソートしたいです。
そういうことができるものがあったら教えてください。

投稿2018/10/16 20:10

kanka

総合スコア26

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

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

yohhoy

2018/10/17 02:40 編集

一度おちついて、要件(やりたいこと)を整理されたほうが良いように見受けられます。質問文の編集を行ってください。 欲しいデータ構造は「(X,Y)ペア を格納する1次元配列」であり、やりたい事は「その1次元配列のうちYをキーとしてソートしたい」でしょうか?
kanka

2018/10/17 02:49

わかりました。編集してきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問