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

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

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

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

Q&A

解決済

4回答

7532閲覧

構造体のメンバへのアクセスにpush_back関数を使用したい

airpoker_3625

総合スコア3

C++

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

0グッド

1クリップ

投稿2021/05/05 03:20

前提・実現したいこと

現在、c++で構造体使用したプログラムを書いており、構造体のメンバへのアクセスへ通常の配列ではなく、vectorクラスを使用しています。そのときにpush_back関数を使って、メンバに値を代入したいのですが、エラーが出てしまい、うまくいきません。最初から要素数を指定せず、push_backを使ってメンバにアクセスする方法はないのでしょうか。

#発生している問題・エラーメッセージ

エラーメッセージ エラー (アクティブ) E0135 class "std::vector<StaffInfo, std::allocator<StaffInfo>>" にメンバー "name" がありません エラー C2039 'name': 'std::vector<StaffInfo,std::allocator<StaffInfo>>' のメンバーではありません #該当のソースコード #include <iostream> #include <string> #include <vector> using namespace std; struct StaffInfo{ string name; int age; int height; }; int main() { vector<StaffInfo>data; int i = 0; data.name.push_back("suzuki"); //エラー data.age.push_back(20); //エラー data.height.push_back(170); //エラー vector<StaffInfo>data2(10); //要素数指定 正常だが、vectorの意味を感じない data2[i].name = "suzuki"; data2[i].age = 20; data2[i].height = 170; return 0; } ### 試したこと ここに問題に対して試したことを記載してください。 ### 補足情報(FW/ツールのバージョンなど) visual studio 2019

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

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

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

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

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

guest

回答4

0

c++20

1vector<StaffInfo>data; 2data.push_back({ 3 .name = "suzuki", 4 .age = 20, 5 .height = 170 6});

c++20を使える状況で、かつコンストラクタを定義しないのであれば指示付き初期化をオススメします。

投稿2021/05/05 04:59

asm

総合スコア15149

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

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

airpoker_3625

2021/05/05 07:25

ご回答ありがとうございます。指示付き初期化というものを初めて知ったので、もう少し自分で調べてみようと思います。
guest

0

値をまとめて押し込んで下さい。

C++

1data.push_back({"suzuki", 20, 170});

最適化に飲み込まれるような微々たる差かもしれませんが、
このような使い方をするときは push_back より emplace_back の方が効率的かなと思いました。

C++

1data.emplace_back("suzuki", 20, 170);

コードの貼り方について

teratailには、コードを見やすく表示する機能があります。
質問編集画面を開き、コードを選択した状態で<code>ボタンを押して下さい。
C++

ハッシュ(#)を全角にされてしまうと、コピペで検証ができず不便です。

投稿2021/05/05 03:28

編集2021/05/05 03:39
LouiS0616

総合スコア35668

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

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

airpoker_3625

2021/05/05 07:16

ありがとうございます。#includeの部分が大きくなってしまっていたので、全角にしてしまいました。 次からは教えていただいた機能で対処しようと思います。
guest

0

ベストアンサー

C++

1#include <iostream> 2#include <string> 3#include <vector> 4 5struct StaffInfo { 6 std::string name; 7 int age; 8 int height; 9 StaffInfo() {} 10 StaffInfo(const std::string& n, int a, int h) 11 : name(n), age(a), height(h) {} 12}; 13 14StaffInfo make_staff(const std::string& n, int a, int h) { 15 StaffInfo si; 16 si.name = n; 17 si.age = a; 18 si.height = h; 19 return si; 20} 21 22int main() { 23 std::vector<StaffInfo> data; 24 data.push_back(make_staff("suzuki", 20, 170)); // コレか 25 data.push_back(StaffInfo("suzuki", 20, 170)); // あるいはコレか 26 data.emplace_back("suzuki", 20, 170); // さもなくばコレ 27}

投稿2021/05/05 03:38

episteme

総合スコア16612

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

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

yumetodo

2021/05/05 06:09

今回のケースでは自前でctor書く必要はないんじゃないかなぁと
airpoker_3625

2021/05/05 07:44

様々な解決法を提示していただき、ありがとうございます。data.name.push_back("suzuki"); のように個別にアクセスはできないみたいですね。勉強になりました。
yumetodo

2021/05/05 10:49

そりゃまぁそもそもdata.nameというアクセスができないですよねっていう。
guest

0

cpp

1data.name.push_back("suzuki"); //エラー 2data2[i].name = "suzuki"; 3 4data.push_back({"suzuki", 20, 170});

一行目と二行目でやっていることが全く違います
最後の行がやりたいことでしょうか?これなら要素数を指定しなくてもいいと思いますが

投稿2021/05/05 03:30

jamjam3

総合スコア165

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問