の最初の要素のメモリアドレスから myvect.size()*sizeof(foo) バイトを memcopy しても安全ですか?
std::vector<std::pair<T1, T2> > myvect
の配列に
struct foo{
T1 first;
T2 second;
}
配列がベクトルのサイズと同じ数の要素で割り当てられている場合は?
ありがとう
いいえ、少なくとも C++98 では (は POD 型ではないため)T1
を含むクラスでT2
、 と同じレイアウトまたは配置が保証されていません。C++0x では話が異なるかもしれません。std::pair<T1, T2>
std::pair
あなたが尋ねなかった質問への答えはおそらくstd::transform
:
struct pairToFoo {
// optionally this can be a function template.
// template<typename T1, typename T2>
foo operator()(const std::pair<T1,T2> &p) const {
foo f = {p.first, p.second};
return f;
}
};
std::transform(myvect.begin(), myvect.end(), myarray, pairToFoo());
またはstd::copy
、ただし、foooperator=
にペアをパラメータとして指定します。ただし、これはfooを書き直すことができることを前提としています。
struct foo {
T1 first;
T2 second;
foo &operator=(const std::pair<T1,T2> &p) {
first = p.first;
second = p.second;
return *this;
}
};
std::copy(myvect.begin(), myvect.end(), myarray);
一般的に、いいえ。一部のプラットフォーム/コンパイラ/STL 実装ではそうかもしれませんが、とにかく実行しないでください。pair<> と vector<> の両方の実装の詳細に依存することになります。
私自身、 vector<> が連続した配列であることに依存するという罪を犯しました。そのために、私は深く反省しています。しかし、ペア<>... ただノーと言ってください。