действительно ли это безопасно к memcopy myvect.size () *sizeof (нечто) байты от memoryadress первого элемента a
std::vector<std::pair<T1, T2> > myvect
в массив
struct foo{
T1 first;
T2 second;
}
если массив выделяется с тем же числом элементов как размер вектора?
спасибо
Нет, класс, содержащий T1
и T2
, не гарантирован таким же образом, как std::pair
, по крайней мере на C++98 (так как std::pair
не является типом POD). История может быть другой на C++0x.
В общем, нет. На некоторых платформах/компиляторах/реализациих STL это может быть, но все равно не делайте этого. Вы бы полагались на детали реализации как пары<>, так и вектора<>.
Я сам совершил грех полагаться на то, что вектор<> является смежным массивом. За это я глубоко раскаиваюсь. Но пара<>... Просто скажи нет.
Ответ на вопрос, который вы не задали, вероятно, 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);