c ++ std::пара, std:: вектор и memcopy
Вопрос
безопасно ли копировать в память 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<> быть непрерывным массивом.За это я глубоко раскаиваюсь.Но эта пара<>...Просто скажи "нет".