从a的第一个元素的内存地址开始,复制myvect.size() * sizeof(foo)字节的数据是安全的吗?
std::vector<std::pair<T1, T2> > myvect
将其转换为数组
struct foo{
T1 first;
T2 second;
}
如果数组被分配的元素数量与向量大小相同,会怎样呢?
谢谢。
从a的第一个元素的内存地址开始,复制myvect.size() * sizeof(foo)字节的数据是安全的吗?
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中情况可能会有所不同。
struct foo
是POD类型时才可以。:-P(对于这个问题来说,这意味着T1
和T2
也是。) - C. K. Youngstd::copy()
仍然可以使用(只要该类型支持赋值)。所以我的“纯粹主义”观点是错误的 - 应该简单地使用它。希望优化会导致编译器生成memcpy()
等效代码,如果类型是POD,则我将查看一些汇编输出以确定实践中是否真的发生这种情况。无论如何,输出很可能足够好,除非它不够好(对于这种泛泛而谈的说法满意吗?)。 - Michael Burrstd::copy()
创建的代码比std::memcpy()
更好——std::copy()
的特化可以轻松受益于类型对齐限制。例如,std::copy<double*>
可能在没有先前检查的情况下使用64位对齐读/写。 - MSalters你没有问的问题的答案可能是 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);
std::transform()
是我永远记不住的东西。从来没有。也许现在我公开说了,有时它会突然出现在我的脑海里。 - Michael Burrstd::transform
是你得到的东西,而不是 map 和 zipWith。所以也许如果每次你忘记了 transform,你就在 Haskell 中重新编写相关函数,那么你就会记住它。即使只是为了避免编写 Haskell。 - Steve Jessopstd::vector<T>
是连续的(我认为C++的未来版本会明确规定),而且&vec[0]
应该可以用作大小为vec.size()
的数组。但是,对于像std::pair
这样的非POD类型进行memcpy
操作是有风险的。 - C. K. Youngstd::vector<>
的更多信息链接:https://dev59.com/enVC5IYBdhLWcg3wliKe 和 http://herbsutter.wordpress.com/2008/04/07/cringe-not-vectors-are-guaranteed-to-be-contiguous/ - Michael Burr