それ、メッセージ花火でわざわざ伝えること?

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<> は使用できません。

A 回答 (3件)

あ, 長さはそうなっちゃいますね. すみません.



ただ, 速度についてはどうにもならないような気がします. 動的メモリ確保は結構重たい処理なので, 大量に実行するとどうしても時間がかかっちゃいます. #1 で
「速いか」といわれるとわからない
と書いたのも, 「ど~書いても時間は同じくらいかかるんじゃないかなぁ」と思ったことが根底にあります.

「高速化したい」ということであれば, 作った「2次元配列」をどう使うかによるんだけど.... その「約10秒」が全体の実行時間に影響するようだと, データ構造から考え直さないといけないかもしれん.
    • good
    • 0
この回答へのお礼

>動的メモリ確保は結構重たい処理

相当に重い処理だったのですね。

 future & async() や Concurrency::parallel_for_each() などでマルチスレッド化してもOSの動的メモリ確保受付窓口が1つしか無いためか、オーバーヘッドが発生して倍の20秒程度かかってしまいました。

vectorを使った、この方法での速度アップはあきらめることにします。 おつき合いありがとうございました。

お礼日時:2013/11/06 08:18

template<typename T, size_t R>


struct reserve_vector : public vector<T> {
reserve_vector() { reserve(R); }
};

vector<reserve_vector<int,10>> a;

...なんてのはダメですか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/11/05 07:57

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

    • good
    • 0
この回答へのお礼

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; の様に管理しなければならなくなりますね。

お礼日時:2013/11/05 08:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!