8

の最初の要素のメモリアドレスから myvect.size()*sizeof(foo) バイトを memcopy しても安全ですか?

std::vector<std::pair<T1, T2> > myvect

の配列に

struct foo{
    T1 first;
    T2 second;
}

配列がベクトルのサイズと同じ数の要素で割り当てられている場合は?

ありがとう

4

3 に答える 3

8

いいえ、少なくとも C++98 では (は POD 型ではないため)T1を含むクラスでT2、 と同じレイアウトまたは配置が保証されていません。C++0x では話が異なるかもしれません。std::pair<T1, T2>std::pair

于 2010-01-05T22:21:17.863 に答える
4

あなたが尋ねなかった質問への答えはおそらく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);
于 2010-01-06T01:03:28.177 に答える
0

一般的に、いいえ。一部のプラットフォーム/コンパイラ/STL 実装ではそうかもしれませんが、とにかく実行しないでください。pair<> と vector<> の両方の実装の詳細に依存することになります。

私自身、 vector<> が連続した配列であることに依存するという罪を犯しました。そのために、私は深く反省しています。しかし、ペア<>... ただノーと言ってください。

于 2010-01-05T22:22:42.043 に答える