[英]Copy data of vector<MyStruct> to a pointer of a vector<MyStruct>
我有 2 個向量:一個是 MyStruct
std::vector<MyStruct> v1 = get_some_data();
另一個是指向 memory 的指針
void * p = get_memory_by_NIF_of_Erlang(..., v1.size());
std::vector<MyStruct> *v2 = static_cast<std::vector<MyStruct>*>(p);
我想將v1
的數據復制到v2
。 我不想將v2
指向v1
,因為它已經創建並指向其他地方。
我怎樣才能正確地做到這一點?
這不會編譯,而且可能一起出錯:
for (auto i = 0; i < v1.size(); i++) {
*(v2 + i * sizeof(MyStruct)) = v1[i]; //error: no viable overloaded '='
}
什么是慣用方式?
做這樣的事情可以實現嗎?
std::vector<_element>* vec2 = new std::vector<_element>();
vec2->reserve(vec1.size()); //So we have enough space
for(size_t i = 0; i < vec1.size(); i++)
{
vec2->push_back(vec1[i]);
}
它應該將第一個向量中的所有內容復制到第二個向量,並且它們完全分開,因此刪除第一個向量不會影響第二個向量。
1. 如果void* p
指向您要用於存儲v1
元素的 memory 緩沖區。
要使用給定的 memory 緩沖區來存儲std::vector
元素,您可以做的一件事是使用多態分配器和std::pmr::monotonic_buffer_resource
:
using T = int;
std::vector<T> v1{1, 2, 3};
const auto buffer_size = v1.size() * sizeof(T);
void* p = /* get_some_memory(...) */ std::malloc(buffer_size);
std::pmr::monotonic_buffer_resource pool(
p, buffer_size, std::pmr::null_memory_resource());
std::pmr::vector<T> v2(v1.begin(), v1.end(), &pool);
for (auto x : v2)
std::cout << x << ' '; // Output: 1 2 3
// dirty hack
for (std::size_t i = 0; i < v2.size(); ++i)
std::cout << *((T*)p + i) << ' '; // Output: 1 2 3
向量v2
將使用memory
緩沖區來存儲從向量v1
復制的元素。
2. 如果void* p
指向std::vector
object 並且您想將元素復制到其中。
auto v2 = static_cast<std::vector<T>*>(p);
v2->assign(v1.begin(), v1.end());
// or just
*v2 = v1;
如果p
處沒有std::vector
,則行為未定義。 請注意, std::vector<T>
不是T
的普通數組,它在內部分配 memory 並將對象存儲在堆上(它們的位置根本與p
無關)。 它自己的大小通常為 24 字節(3 個指針,每個 8 字節)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.