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

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

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

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

Q&A

解決済

1回答

1509閲覧

C++ struct構造体の代入方法をpair型のように簡潔にする方法はありますか?

mjk

総合スコア303

C++

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

0グッド

0クリップ

投稿2020/08/31 03:08

要点
s1.emplace(y1, x1);
s2.emplace(P2({y2, x2}));

#質問
pair型データの代入は(y1,x1)というような簡潔な記述で出来ているのですが、
struct型データへの代入では(P2({y2, x2}))というように冗長になってしまっています。
これをpair型データの代入のように簡潔に記述する方法の有無を知りたいです。


また「pair型使えばいいじゃん」と言われそうですが確かにpair型は便利なのですが.firstや.secondを使いたくないのと要素が3個の時もあるのでstructで慣れておきたいというのが理由です。
(pair型の入れ子は見づらいなど)

#試したこと
最初はpair型と同じように記述しているとコンパイル時にエラーが多発したので記述方法が間違っていると気づきました。
手探りで(){}などをあれこれつけているうちに偶然エラーが無くなりました。


C++

1#include <bits/stdc++.h> 2using P1 = std::pair<int, int>; 3 4struct P2 { 5 int y; 6 int x; 7}; 8 9int main() { 10 11 int y1 = 1, x1 = 11; 12 int y2 = 2, x2 = 22; 13 14 std::set<P1> s1; 15 std::set<P2> s2; 16 17 s1.emplace(y1, x1); //質問内容部分 18 s2.emplace(P2({y2, x2})); //上のpair型と同じような記述にすることは可能? 19 20}

開発環境

Win10
VSC1.47.3
C++14
gcc version 8.2.0 (Rev3, Built by MSYS2 project)

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

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

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

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

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

guest

回答1

0

ベストアンサー

構造体にコンストラクタ P2(int, int) を作っておけば、同様に emplace(y, x) で追加できます。
また、構造体を set のテンプレート引数として使うには二項演算子 "<" を定義しておく必要があります。

set - cpprefjp C++日本語リファレンス

python

1#include <iostream> 2#include <set> 3#include <utility> 4 5using P1 = std::pair<int, int>; 6 7struct P2 { 8 P2(int y, int x) : y(y), x(x) 9 { 10 } 11 12 bool operator<(const P2 &rhs) const 13 { 14 // y の値を優先してソートするなら 15 return y != rhs.y ? y < rhs.y : x < rhs.x; 16 } 17 18 int y; 19 int x; 20}; 21 22int main() 23{ 24 25 int x = 1, y = 2; 26 27 std::set<P1> s1; 28 std::set<P2> s2; 29 30 s1.emplace(y, x); 31 s2.emplace(y, x); 32 33 for (const auto &point : s2) 34 std::cout << "(y, x) = " << point.y << "," << point.x << std::endl; 35} 36

投稿2020/08/31 03:25

編集2020/08/31 03:37
tiitoi

総合スコア21956

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

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

mjk

2020/08/31 03:32

回答ありがとうございます。 ちょっとすぐに理解するのは難しそうですが雛形として試行錯誤してみます。 _yの_アンダーバーは慣習のようなものでしょうか?好みで変えても大丈夫なのか決まりごとのようなもので変更出来ないとかありますか?
tiitoi

2020/08/31 03:44 編集

コンストラクタ引数名とメンバー変数の名前が同じだと、区別できなくなるかと思ってそうしていたのですが、調べたら仕様上大丈夫みたいだったので、コードを修正しました。 もちろん、通常の関数の引数と同様に好みで変えて大丈夫です。 P2(int y, int x) : y(y), x(x) はコンストラクタ初期化子でメンバー変数を初期化するための構文です。「引数で受け取ったyでメンバ変数yを初期化、引数で受け取ったxでメンバ変数xを初期化する」という意味です。 http://kaitei.net/cpp/constructors/
mjk

2020/08/31 03:45

ありがとうございます。確かに同じだと混同してしまいそうですね。_yのものと両方使って試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問