std::vectorv(data, data + sz);
PODに対して(というか,PODに限らずポインタとサイズが与えられたときにvectorを初期化する手段として)最善となるコードです.上のコードによって具体的に何がなされるかはおおよそ以下のとおりです.
- 引数のiteratorの差(distance)から確保するべきbufferのサイズを計算し,必要なサイズのバッファを確保する(引数がポインタ,即ちrandom_access_iteratorなのでこれが定数複雑性で可能)
- 確保したバッファに対してstd::uninitialized_copyを呼ぶ.uninitialized_copyは名前のとおり確保はしているがオブジェクトの構築を行っていないメモリに対して値をcopyするアルゴリズムで,PODに対してはmemmove,non-PODに対しては明示的なfor文による配置構文new(placement new)で実装される.
従って,value_typeがPODなら本質的にはnew + memmoveな実装になるため,これだとmemcpyと比較してもある程度耐えうる速度が出る(というか,多分フリーストア確保の速度が圧倒的に遅いはずなので,memcpyとの差が目立たなくなる)と予想されますがどうでしょうか?
ちなみに,すでにvectorのオブジェクトがある場合に,ポインタの範囲でこれを再初期化するインタフェースとしてiterator範囲によるassignがあります.
v.assign(data, data + sz);