2009-08-20 16 views

答えて

5

multimap<int,int>の値のタイプは、pair<int,int>です。これは、ベクターが保持したいものとまったく同じです。だから、あなたはマルチマップからベクトルを初期化するコンストラクタを使用することができます。

std::vector< std::pair<int,int> > v(mmap.begin(), mmap.end()); 

それとも、あなたが要素をコピーする既存のベクトルがある場合:

v.resize(mmap.size()); 
std::copy(mmap.begin(), mmap.end(), v.begin()); 

をあなたが使用することもできstd::back_inserter、それが原因ベクトル再配分に一般的に遅くなることになります。

std::copy(mmap.begin(), mmap.end(), std::back_inserter(v)); 

EDIT 他の質問に答えるには、ベクトルを同様の方法でマルチマップに変換することができます。

std::multimap<int,int> mmap(v.begin(), v.end()); 

これは、もちろん、vstd::vector< std::pair<int,int> >であることを前提としていますマルチマップはまた、イテレータ範囲を受け入れるコンストラクタを有します。

+0

C++の連想配列の値型には定数キーがあります。つまり、std :: multimap :: value_typeはstd :: pair です。理由は、Keyが定数でない場合、コンテナ不変条件を破る非constイテレータによって変更される可能性がある(キー更新後に要素が間違った位置にあることがあるため) –

1

をマッピングするためにベクトルを変換するために探していたトラブルのため申し訳ありませんが、私は単純なアプローチはまた、最も効率的であると信じている:マルチマップを反復、および、各要素を追加ベクトル。最適化として、開始する前にv.reserve(m.size)する必要があります。

要素は、通常、ヒープ上に広がるオブジェクト内のマルチマップのツリーに格納されます。ベクトルの場合、それらは連続したメモリになければなりません。これは本当にそれらを一緒にコピーする必要があります。

+0

それでは、for_eachを使用することは可能ですか? – yesraaj

+1

必要ありません:vector :: assign(Iter begin、Iter end)は、メモリallcoationとループの両方を処理する単一の操作です。 – MSalters

関連する問題