- ベストアンサー
※ 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);を行う方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
あ, 長さはそうなっちゃいますね. すみません. ただ, 速度についてはどうにもならないような気がします. 動的メモリ確保は結構重たい処理なので, 大量に実行するとどうしても時間がかかっちゃいます. #1 で 「速いか」といわれるとわからない と書いたのも, 「ど~書いても時間は同じくらいかかるんじゃないかなぁ」と思ったことが根底にあります. 「高速化したい」ということであれば, 作った「2次元配列」をどう使うかによるんだけど.... その「約10秒」が全体の実行時間に影響するようだと, データ構造から考え直さないといけないかもしれん.
その他の回答 (2)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
回答No.2
template<typename T, size_t R> struct reserve_vector : public vector<T> { reserve_vector() { reserve(R); } }; vector<reserve_vector<int,10>> a; ...なんてのはダメですか?
質問者
お礼
教えて頂いた方法を試してみましたが 今度は a.resize(N)で10秒消費してしまい 速度的には変わりませんでした。
- Tacosan
- ベストアンサー率23% (3656/15482)
回答No.1
resize で初期値を与えることはできるけど, 「速いか」といわれるとわからない.
質問者
お礼
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; の様に管理しなければならなくなりますね。
お礼
>動的メモリ確保は結構重たい処理 相当に重い処理だったのですね。 future & async() や Concurrency::parallel_for_each() などでマルチスレッド化してもOSの動的メモリ確保受付窓口が1つしか無いためか、オーバーヘッドが発生して倍の20秒程度かかってしまいました。 vectorを使った、この方法での速度アップはあきらめることにします。 おつき合いありがとうございました。