Вопрос

безопасно ли копировать в память myvect.size()*sizeof(foo) байты из memoryadress первого элемента

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

в массив из

struct foo{
    T1 first;
    T2 second;
}

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

Спасибо

Это было полезно?

Решение

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

Другие советы

Ответ на вопрос, который вы не задавали, вероятно, таков 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 an 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);

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top