C++ std::pair, std::vector & memcopy
Безопасно ли memcopy myvect.size()*sizeof(foo) байтов из адреса памяти первого элемента
std::vector<std::pair<T1, T2> > myvect
в массив
struct foo{
T1 first;
T2 second;
}
если массив выделен с тем же количеством элементов, что и размер вектора?
Спасибо
3 ответа
Нет, класс, содержащий 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
но дайте фу 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<> является непрерывным массивом. За это я глубоко раскаиваюсь. Но пара <>... Просто скажи нет.