2017-01-20 9 views
0

Iは第一次元が第二の寸法により一定である二次元ベクトルを作成する必要が異なっている、例えば二次元STDを作成::ベクトル

int const mysize = 3; 
int vecSizes[3] = {7, 2, 10}; 
vector<vector<int>> out_buff(mysize); 

を私は私の内側ベクターが記載されるようにします大きなベクトルを使用した場合、それは時間がかかるので、私はpush_backまたはresizeを使用したくない次

out_buff[0] // has size 7 
out_buff[1] // has size 2 
out_buff[2] // has size 10 

としてvecSizes中サイズに、それを行う方法はありますか?

+1

「それは時間がかかるので、私は一backを使用したり、サイズを変更したくない」 - まあ、もちろんそれには時間がかかります。あなたは時間がかからない解決策を見つけるつもりはありません。 'push_back'に要する時間は妥当であり、あなたが移動のコストを受け入れることさえできなければ常に' emplace_back'があります。 – user2357112

答えて

0

(それが唯一の1つの割り当てを行いますので、好ましくはresize)希望するサイズのベクトルを作成するために、あなたはpush_backresizeを使用する必要がありますので、std::vectorの要素は、構築する必要が

ワン代わりに実際にサイズを変更する代わりに、ちょうどメモリを割り当てますが、実際には要素を挿入しないreserveを呼び出すことができます。報告されたサイズはまだゼロですが、capacityは少なくともreserveに渡されたものを返します。

0

ここには、OPのコードを少し変更した完全なプログラムがあります。サイズと容量のアサーション(つまり検証)に注目してください。

#include <vector> 
#include <cassert> 
using namespace std; 

int main() { 
    enum {N = 3}; 
    int const vecSizes[N] = {7, 2, 10}; 
    vector<vector<int>> out_buff{N}; 

    assert(out_buff.size() == N); 
    assert(out_buff.capacity() == N); 

    for (int i = 0; i != N; ++i) { 
    out_buff.at(i).reserve(vecSizes[i]); 
    } 

    int i = 0; 
    for (auto const& vec : out_buff) { 
    assert(vec.size() == 0); 
    assert(vec.capacity() == vecSizes[i++]); 
    } 
} 

ライブ例:http://ideone.com/ikm1LR