станд. C++:: пара, станд.:: вектор и memcopy

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

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

в массив

struct foo{
    T1 first;
    T2 second;
}

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

спасибо

8
задан T.C. 17 December 2014 в 04:05
поделиться

3 ответа

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

.
8
ответ дан 5 December 2019 в 14:03
поделиться

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

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

0
ответ дан 5 December 2019 в 14:03
поделиться

Ответ на вопрос, который вы не задали, вероятно, 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 оператор =, приняв пару в качестве параметра. Это предполагает, что можно переписать 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);
4
ответ дан 5 December 2019 в 14:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: