reima が既に述べたように、既存のシーケンスのみを参照したい場合は、キャストmyvector.data()
するだけで十分です (ホールドint*
を想定)。sizeof(mypoint) == 2 * sizeof(int)
ただし、フラット化されたシーケンスのコピーが明示的に必要な場合は、次のような小さなユーティリティ関数を作成する方がよいでしょう。
template <typename T, typename U>
std::vector<T> flatten(std::vector<U> const& other) {
static_assert(std::is_trivially_copyable<U>::value,
"source type must be trivially copyable!");
static_assert(std::is_trivially_copy_constructible<T>::value,
"destination type must be trivially copy constructible!");
static_assert((sizeof(U) / sizeof(T)) * sizeof(T) == sizeof(U),
"sizeof(U) must be a multiple of sizeof(T)!");
return std::vector<T>(reinterpret_cast<T const*>(other.data()),
reinterpret_cast<T const*>(std::next(other.data(), other.size())));
}
template <typename U>
std::vector<typename U::value_type> flatten(std::vector<U> const& other) {
return flatten<typename U::value_type>(other);
}
コードを
auto newvector = flatten<int>(myvector);
mypoint
struct
または- (STL準拠の)value_type
メンバータイプを装備している場合-
auto newvector = flatten(myvector);
このユーティリティ関数は、ポインターをポインターreinterpret_cast
に変換するために本質的に安全ではないコンストラクターを微調整したものにすぎないことに注意してください。の使用に伴う安全上の警告を取り除くために、関数はいくつかのパラシュートを使用します。したがって、これらすべてを別の関数で非表示にすることをお勧めします。それでも、、ムーブ コンストラクション、、タイプ トレイトなどの多くの C++11 機能を使用し、呼び出しサイト コードを最小限に抑えます。mypoint
int
reinterpret_cast
flatten
static_assert
auto
static_assert
std::next
vector::data()
vector
また、の範囲コンストラクターはメモリ割り当てと call のみを実行するため、uninitialized_copy
これは非常に効率的memcpy
です。