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

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

新規登録して質問してみよう
ただいま回答率
85.35%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

C++

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

Q&A

解決済

2回答

2654閲覧

std::vector変数にstd::vector型の戻り値を正しく入れる方法が知りたい。参照型と値型など

退会済みユーザー

退会済みユーザー

総合スコア0

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

C++

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

0グッド

0クリップ

投稿2020/07/31 13:57

編集2020/08/01 03:57

GetLoad_CSV();関数で.csvファイルを読み込みその戻り値がvectorの二次元int型配列なのですがそのvectorの二次元int型配列を格納するstd::vector<>型配列をどう記述すればいいのかわかりません。どうすればいいのでしょうか?
提示コードのidx変数は値型で実装することができましたが自分は参照型で行いたいためstd::vector<std::vector<int>> *;の戻り値を使いたいのですがどうすればいいのでしょうか?

#include "stdio.h" #include <vector> std::vector<std::vector<int>> *GetLoad_CSV(const char *filename, std::vector<std::vector<int>> **result); std::vector<std::vector<int>> *GetLoad_CSV(const char *filename, std::vector<std::vector<int>> **result) { FILE *fp; char tm[5000]; //読み込んだ.csvファイルの文字列 //const char *filename = "MapLayer1.csv"; //.csvファイルを読み込む //std::vector<std::vector<int>> idx; //マップチップ番号格納 std::vector<std::vector<int>> *idx = new (std::vector<std::vector<int>>); //マップチップ番号格納 int vi = 0; char str[10]; fp = fopen(filename, "r"); if (fp == NULL) { printf("読み込み失敗\n"); exit(1); } // printf("読み込み成功\n"); while (fgets(tm, 5000, fp) != NULL) //一行づつ読み取り { idx->emplace_back(); int i = 0; int c = 0; while (true) { if ((tm[i] >= '0' && tm[i] <= '9') || (tm[i] == '-' || tm[i] == '+')) //文字だった場合 { str[c] = tm[i]; i++; c++; } else { int t = atoi(str); //数字をint型に変換 idx->back().push_back(t); //最後の配列に追加 memset(str, '\0', sizeof(str)); //数字保存char型配列を空にする //文字以外の数字でそれが'\n','\0'だった最後なのでループを抜ける if (tm[i] == '\n' || tm[i] == '\0') { break; } c = 0; i++; } } } //print_vector(idx); if (result != NULL) { *result = idx; } return idx; } std::vector<std::vector<std::vector<int>>> idx; std::vector<std::vector<int>> *idx2; int main(int argc,char** argv) { idx2 = GetLoad_CSV("MapLayer1.csv", nullptr); idx.emplace_back(); idx.push_back(*GetLoad_CSV("MapLayer1.csv", nullptr)); idx.push_back(*GetLoad_CSV("MapLayer2.csv", nullptr)); idx.push_back(*GetLoad_CSV("MapLayer3.csv", nullptr)); printf("aaaa\n"); return 0; }

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

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

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

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

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

guest

回答2

0

ベストアンサー

ポインタで返すのであれば、スマートポインタ(unique_ptr)で保持してはいかがでしょう。
vectorから要素を削除した際にdeleteされます。

C++

1#include <memory> 2#include <utility> 3using IdxPtr = std::unique_ptr<std::vector<std::vector<int>>>; 4std::vector<IdxPtr> idx; 5int main(int argc, char** argv) 6{ 7 idx.push_back(std::move(IdxPtr(GetLoad_CSV("MapLayer1.csv", nullptr)))); 8 idx.push_back(std::move(IdxPtr(GetLoad_CSV("MapLayer2.csv", nullptr)))); 9 idx.push_back(std::move(IdxPtr(GetLoad_CSV("MapLayer3.csv", nullptr)))); 10 11 return 0; 12}

std::
unique_ptr

投稿2020/08/02 01:40

編集2020/08/02 01:45
SHOMI

総合スコア4079

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

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

0

下記のコードにより自己解決です。emplace.back();と.push_back();の使い方を間違えていました。
printf();が出力されいるのでどっかで書き込みエラー等が発生していないことを確認しましたので自己解決とします。

std::vector<std::vector<std::vector<int>>> idx; int main(int argc,char** argv) { idx.emplace_back(); idx.push_back(*GetLoad_CSV("MapLayer1.csv", nullptr)); idx.push_back(*GetLoad_CSV("MapLayer2.csv", nullptr)); idx.push_back(*GetLoad_CSV("MapLayer3.csv", nullptr)); printf("aaaa\n"); return 0; }

投稿2020/07/31 14:36

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

SHOMI

2020/07/31 14:42

> std::vector<std::vector<int>> *idx = new (std::vector<std::vector<int>>); deleteされずにメモリリークしてますがいいんですか?
退会済みユーザー

退会済みユーザー

2020/07/31 15:17

質問ですがこれはint main();関数でアドレスの値ということで*を使っているので値を渡しているがアドレスは渡していなのでその場合GetLoad_CSV関数のidxをdeleteする必要がるのということでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問