簡體   English   中英

復制向量的數據<mystruct>指向向量的指針<mystruct></mystruct></mystruct>

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM