• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:std::vector 2次元配列の列方向初期長)

std::vector 2次元配列の列方向初期長

このQ&Aのポイント
  • std::vectorを使用して2次元配列を宣言する際、列方向の初期長を指定する方法はありますか?
  • 通常、列方向の初期長を指定しない場合、a.resize(N)を実行した後にfor (auto &n : a) n.reserve(10);を行いますが、これは時間がかかります。
  • aの列方向の初期長を10と指定する方法で、a.resize(N)を実行した際に自動的にfor (auto &n : a) n.reserve(10);を行う方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

あ, 長さはそうなっちゃいますね. すみません. ただ, 速度についてはどうにもならないような気がします. 動的メモリ確保は結構重たい処理なので, 大量に実行するとどうしても時間がかかっちゃいます. #1 で 「速いか」といわれるとわからない と書いたのも, 「ど~書いても時間は同じくらいかかるんじゃないかなぁ」と思ったことが根底にあります. 「高速化したい」ということであれば, 作った「2次元配列」をどう使うかによるんだけど.... その「約10秒」が全体の実行時間に影響するようだと, データ構造から考え直さないといけないかもしれん.

mpach
質問者

お礼

>動的メモリ確保は結構重たい処理 相当に重い処理だったのですね。  future & async() や Concurrency::parallel_for_each() などでマルチスレッド化してもOSの動的メモリ確保受付窓口が1つしか無いためか、オーバーヘッドが発生して倍の20秒程度かかってしまいました。 vectorを使った、この方法での速度アップはあきらめることにします。 おつき合いありがとうございました。

その他の回答 (2)

回答No.2

template<typename T, size_t R> struct reserve_vector : public vector<T> { reserve_vector() { reserve(R); } }; vector<reserve_vector<int,10>> a; ...なんてのはダメですか?

mpach
質問者

お礼

教えて頂いた方法を試してみましたが 今度は a.resize(N)で10秒消費してしまい 速度的には変わりませんでした。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

resize で初期値を与えることはできるけど, 「速いか」といわれるとわからない.

mpach
質問者

お礼

a.resize(N); for (auto &n : a) n.resize(10); と指定しても、for (auto &n : a) n.resize(10); に10秒消費してしまいます。 またresize()で実体を割り当てしまうとpush_back()した際 11個目から追加動作してしまうので、内部にカウンターを定義して i=0, n[i++]=b; の様に管理しなければならなくなりますね。

関連するQ&A

専門家に質問してみよう