c ++ std :: pair, std :: vector & memcopy - PullRequest
       22

c ++ std :: pair, std :: vector & memcopy

8 голосов
/ 06 января 2010

Безопасно ли memcopy myvect.size () * sizeof (foo) байтов из адреса памяти первого элемента

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

в массив

struct foo{
    T1 first;
    T2 second;
}

если массив выделен с тем же количеством элементов, что и размер вектора?

спасибо

Ответы [ 3 ]

8 голосов
/ 06 января 2010

Нет, классу, содержащему T1 и T2, не гарантируется тот же макет или выравнивание, что и std::pair<T1, T2>, по крайней мере в C ++ 98 (поскольку std::pair не является типом POD). История может отличаться в C ++ 0x.

4 голосов
/ 06 января 2010

Ответ на вопрос, который вы не задавали, вероятно, 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, но дайте foo operator=, принимая пару в качестве параметра. Это предполагает, что вы можете переписать 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);
0 голосов
/ 06 января 2010

В общем, нет. На некоторых платформах / компиляторах / реализациях STL это может быть, но все равно этого не делают. Вы будете полагаться на детали реализации как пары <>, так и вектора <>.

Я сам совершил грех, полагаясь на то, что vector <> является непрерывным массивом. За это я глубоко раскаиваюсь. Но пара <> ... Просто скажи нет.

...