![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
define で 配列
-
ポインタを使って構造体の配列...
-
c言語
-
Cのエラー
-
[C++]const int と配列
-
C言語において、 配列要素をひ...
-
C#で構造体の配列を持った構造...
-
VB.NETにおける構造体の初期化
-
C++DLLからC#へのコールバック...
-
C#でのフィボナッチ数列
-
AfxBeginThread の引数について
-
C#で配列が空かを判定するには?
-
fscanfについて質問です。
-
バイナリデータ作成したいので...
-
構造体のextern方法
-
配列のアドレス部
-
int i, int i[1];
-
MFCのCArrayを使った二次元配列
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
構造体のextern方法
-
配列の要素数に変数を入れたい...
-
C言語において、 配列要素をひ...
-
define で 配列
-
c言語
-
C#で構造体の配列を持った構造...
-
C言語 ファイルの指定された行...
-
c言語 構造体
-
コンボボックスでデフォルト値...
-
配列のアドレス部
-
MFCのCArrayを使った二次元配列
-
MFC - ダイアログボックスのPic...
-
C言語についてです 5人のテスト...
-
C言語から質問です。
-
AfxBeginThread の引数について
-
C言語の課題が出たのですが自力...
-
Cのエラー
-
int i, int i[1];
-
C#で配列が空かを判定するには?
おすすめ情報