- 締切済み
csv読込でVectorに格納した数値を分類したい
C++について2回目の質問となります。 私、現在CSVファイルの値を取得するコードを書いています。 後々、この値をある計算に使う予定です。 そこで、計算に使う際に使いやすいように分類しながら値を変数に格納したいと考えてます。 CSV1行を分割後にVectorに格納しようと考えています。 このVectorの型に構造体を入れることってできるのでしょうか。 1行を分類したいという意図がありまして、Vector<struct ***>とできないかと思っているのですが、 これは有効なのかがわかりません。 当初は、Vector<int>にするか、Vectorを2次元配列にしてCSVデータを入れていき、計算のときに何番目(何列目)を取り出す、というやりかたにしようと考えていたのですが、分類の仕方は決まりきっているので、分類ごとに構造体を用意し、Vector<struct ***>に順番に入れていく、というやり方を思いつきました。 が、1行を一旦Vector<int>に入れてしまって、あとで必要なところを要素指定したほうがいいのではとまた思い直し、混乱が起こっています。 Vector<struct ***>ということはできるのか、という点、 Vector<int>にして、あとで構造体(変数?)にいれるべきなのか、という点、 または、Vectorに入れるべきではないのか(構造体に入れるならば、リストにすべきか)という点を教えていただけないでしょうか。 わかりにくいようでしたら、随時ご指摘お願いします。 すみません、C++初心者なので、もしかしたらとんでもないことをいっているかもしれませんが、有識者の方、アドバイスをお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- hitomura
- ベストアンサー率48% (325/664)
……あれ? ごめんなさい、私が想像していたこととちょっと違ってきたのですこし戸惑ってしまいました。 すみませんが、CSVの1行にどんな値が並んでいて、その1行をどう処理して、CSV全体としてはどんな処理がしたいのかを書いていただけないでしょうか。 > あと、別件になってしまうのですが、 > vector<vector<int>>という形の意味は、「1行分を列単位」格納できる、 > ということで合っていまでしょうか。 ノー。 以下の3つの理由で問題があります。 1. CSVには数値だけでなく文字列も並べることができ、数値も整数とは限らない。 2. 並んでいるのが整数だけとしても、その各列には何らかの意味があるはずなのにその意味を無視している。 3. 上記2つに目をつぶるとしても、この形式は「『1行分』をCSVの行数分」という意味のほうが自然である。
- vipasigaru
- ベストアンサー率38% (16/42)
大丈夫でしょうか、って聞く前に、自分で試したほうが早いよ。 この程度のことなら。
お礼
お返事ありがとうございました。 確かにそうですね・・・大変失礼しました。
- hitomura
- ベストアンサー率48% (325/664)
> Vector<struct ***>ということはできるのか 大丈夫、できます。 > Vector<int>にして、あとで構造体(変数?)にいれるべきなのか これに関してはCSVの「列」に対して処理を行うという特別な場合を除いてやる必要は無いと思います。 # 列の総和とか前行同列との差分とかの単純な場合でも必要ない > または、Vectorに入れるべきではないのか(構造体に入れるならば、リストにすべきか) たしかに構造体ならばlistのほうが効率的かな?ただし、listでは各要素へのランダムアクセスはできません。ランダムアクセスが必要ならばvectorを使うべきでしょう。 あと、Vectorではなくvectorだし、C++では構造体を宣言するとき以外はstructは不要です(C言語でtypedefを使わないならば必要ですが)。つまり、 > Vector<struct ***> は vector<***> に……って、*に意味があるC/C++では分かりづらいか。 ようするに、 struct Hoge {}; Hoge fuga; // C言語ならNG, C++ならOK vector<struct Hoge> foo; // これは…… vector<Hoge> bar; // これと同じ意味になる ってことですね。
お礼
早急なお返事ありがとうございます。 大変参考になりました。 vector<***>の***には構造体が入れられるのですね。 構造体で入れられるなら、格納の時点で分類ができるから、 あとで位置指定して、ある要素を取得する、ということが必要なくなり、 listの方が効率がいいかと思いました。 ですが、私が***に入れたい構造体は、以下のような形ですが、大丈夫なのでしょうか。 例: typedef struct{ int max; int ave; }first; typedef struct{ first a; second a; }AAA; struct{ AAA aaa; BBB bbb; }AB; ※Bも同様にAと同様に定義する。 vector<AB> 1種類の構造体ならできそうですが、上記の例で言うと、 ABのAAAのfirst,second,max,ave の順 ABのBBBのfirst,second,max,ave の順 で格納したい。 これってvector<***>にしてうまく順番に入れることができるのでしょうか。 あと、別件になってしまうのですが、 vector<vector<int>>という形の意味は、「1行分を列単位」格納できる、 ということで合っていまでしょうか。
お礼
お返事ありがとうございました。 PCの故障とネットの関係でお返事ができませんでした。 大変申し訳ありませんでした。 csv1行は全て数値でintで扱えるものです。 csvの値は各々の値を計算に使います。 すみません、私の誤記だったのですが、vector<vector<int>>は1行分を行数分ですね。