我有一段旧的代码草稿,大致是这样的:
// sadly I have to use this structure
struct LegacyStruct {
int* values;
}
LegacyStruct* LgStr;
....
std::vector<int> vec;
// fill vector in some way here
size_t sz = vec.size();
LgStr->values = new int[sz];
std::copy(vec.begin(), vec.end(), &LgStr->values[0]);
vec可能很大,我需要避免将其复制到int*中。有没有办法做到这一点?我尝试了以下方法:
// type of new operator explained in More Effective C++
LgStr->values = new (&vec[0])int[vec.size()];
好的,values
指向vec内部数组的开头,但当vec超出范围时会被销毁。 但我必须保留它。
&vec[0] = nullptr; // does not compile of course
问题是:在这种情况下是否可以应用移动语义?或者可能有其他技巧吗?
vector
内部动态分配的int
数组,并将该数组的所有权转移给LegacyStruct
,以便在vector
被销毁后的某个时候使用delete[]
删除它:不行。唯一的好消息是,将数据复制到你的数组中肯定不会比首先填充vector
更慢,因此错过加速的机会不到50%。 - Steve Jessopstd::vector
(第二个模板参数)编写自己的分配器,并将deallocate
实现为空函数。 - Andre