
std::vectorを使った2次元配列を
std::vector< std::vector<int> > a;
の様な方法で宣言できるところまでは分かったのですが、aの列の初期長を予め指定する方法はないでしょうか?
例えば、必要な列方向初期長が10であるとします。
行方向のデータ数Nが実行中に与えられる場合
a.resize(N);
for (auto &n : a) n.reserve(10);
で目的は達せられるのですが、Nが数千万のオーダーだど非常に時間がかかります。
仮にNが2000万個とすると、私のPCでa.resize(N)は約90ミリ秒で完了しますが、for (auto &n : a) n.reserve(10);には約10秒を必要とします。
そこで、aの列の初期長は10(reserve(10)の意味)であると言う何らかの指定を行って
a.resize(N)を行った際に、自動的にfor (auto &n : a) n.reserve(10);を行ったのと同じ状態になっているという aの宣言方法があれば教えてください。
aの列方向の初期長(本例の場合は10)は与えますが、.push_back() により10個以上のデータを列方向に詰める場合も想定する為、完全固定長の std::array<> は使用できません。
No.3ベストアンサー
- 回答日時:
あ, 長さはそうなっちゃいますね. すみません.
ただ, 速度についてはどうにもならないような気がします. 動的メモリ確保は結構重たい処理なので, 大量に実行するとどうしても時間がかかっちゃいます. #1 で
「速いか」といわれるとわからない
と書いたのも, 「ど~書いても時間は同じくらいかかるんじゃないかなぁ」と思ったことが根底にあります.
「高速化したい」ということであれば, 作った「2次元配列」をどう使うかによるんだけど.... その「約10秒」が全体の実行時間に影響するようだと, データ構造から考え直さないといけないかもしれん.
>動的メモリ確保は結構重たい処理
相当に重い処理だったのですね。
future & async() や Concurrency::parallel_for_each() などでマルチスレッド化してもOSの動的メモリ確保受付窓口が1つしか無いためか、オーバーヘッドが発生して倍の20秒程度かかってしまいました。
vectorを使った、この方法での速度アップはあきらめることにします。 おつき合いありがとうございました。
No.2
- 回答日時:
template<typename T, size_t R>
struct reserve_vector : public vector<T> {
reserve_vector() { reserve(R); }
};
vector<reserve_vector<int,10>> a;
...なんてのはダメですか?
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; の様に管理しなければならなくなりますね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてください 9 2022/04/22 18:50
- C言語・C++・C# このプログラミング誰か教えてください。 2 2022/04/22 18:48
- PHP 配列の値の更新方法について 1 2022/08/05 09:49
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- Visual Basic(VBA) VBA シート間の転記で、条件の追加コードの書き方について教えて下さい。 13 2023/02/26 09:31
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- Visual Basic(VBA) vba 等間隔の列に対しての計算 6 2022/05/17 20:15
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 3 2022/06/12 11:17
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
define で 配列
-
c言語
-
C#で構造体の配列を持った構造...
-
C言語 ファイルの指定された行...
-
C言語において、 配列要素をひ...
-
C言語の課題が出たのですが自力...
-
C#で配列が空かを判定するには?
-
構造体のextern方法
-
C言語の配列のコピーについて
-
c言語 構造体
-
C言語 数値の連続入力について
-
MFC - ダイアログボックスのPic...
-
C++DLLからC#へのコールバック...
-
配列のアドレス部
-
要素数・要素の値が未定の配列...
-
C言語についてです 5人のテスト...
-
.NET C++で、構造体の配列をnew...
-
2番目の最大値を求める
おすすめ情報