c ++ std :: pair,std :: vector&存储器复制

时间:2010-01-05 22:18:31

标签: c++ vector memcpy std-pair

的第一个元素的memoryadress中记忆myvect.size()* sizeof(foo)字节是否安全?
std::vector<std::pair<T1, T2> > myvect

进入

数组
struct foo{
    T1 first;
    T2 second;
}

如果为数组分配的元素数与向量的大小相同?

感谢

3 个答案:

答案 0 :(得分:8)

不,包含T1T2的类不能保证与std::pair<T1, T2>具有相同的布局或对齐方式,至少在C ++ 98中是这样(因为std::pair不是一种POD类型)。 C ++ 0x中的故事可能有所不同。

答案 1 :(得分:4)

您未提出的问题的答案可能是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 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);

答案 2 :(得分:0)

一般来说,没有。在某些平台/编译器/ STL实现上它可能是,但不管怎么说都不这样做。您将依赖于两个对的实现细节&lt;&gt;和矢量&lt;&gt;。

我自己犯了依赖vector&lt;&gt;的罪是一个连续的阵列。为此,我深深地忏悔。但该对&lt;&gt; ...只是说不。