2012-12-31 50 views
1

我有一個內存,我使用char * p來訪問它。將char *轉換爲向量C++

我想引用它。我如何製作它?

vector<char>& v = p 

什麼我需要做的,而不是p來將其轉換爲載體,我也需要告訴它我在內存使用的char *的大小。

+2

「std :: vector」不可能使用對現有內存的引用。你可以在'std :: vector'創建後引用內存,或者你可以用內存中的數據內容初始化'std :: vector'。 –

+1

你想要什麼樣的矢量?在指向的位置有什麼樣的數據?沒有更多的信息很難回答這個問題,但最直接的解決方案可能是將p轉換爲正確類型的指針,然後使用std :: vector wewvec(p,p + 20)等構造一個新的向量。是,如果數據真的是char。 –

+0

你打算如何處理參考?爲什麼你不能只用p?如:p [3],? –

回答

1

很難回答這個問題沒有更多的信息,但我會嘗試。最直接的解決方案可能是將p轉換爲正確類型的指針,然後構造一個新的向量。如果你想要一個字符向量:

std::vector<char> wewvec(p,p+20) 

其中20是你會給元素的數量。也就是說,如果數據真的是字符。

如果數據是一些其他類型的,比如說它含有20個飄浮,你可以這樣做:

const float* pf=reinterpret_cast<const float*>(p); 
std::vector<float> wewvec(pf,pf+20) 

迪特里希寫道,這將副本數據到新的載體。

+0

['錯誤:從'const char *'類型無效的static_cast類型'const float *''](https://ideone.com/EnAOIu) –

+1

謝謝,這很令人尷尬。應該是reinterpret_cast。 https://ideone.com/ox5Uxz –

0

如果你有一個指針p指向一個內存塊

char* p = new char[100]; 

可以通過編寫

char& q = *p; 

如果你使用vector,你將需要複製的容器創建對它的引用作爲約翰說的向量的內容

+0

是的,我試圖找到一種方式,而不復制它 –

+0

@Boris:這是一個非首發。 –

0

基本上:

  • 一個向量擁有它的內存,它不只是引用它。所以你可以創建一個新的向量來複制你的數據,但是你不能讓載體「獲取」你的指針並使用它。

  • 如果你必須有一個載體傳遞到第三方API和你有一個指針,你將不得不作出一個副本

  • 如果你是在API的控制,你可以改變它採取一系列的指針(開始/結束)或指針和大小。這樣,如果你已經有一個向量,你仍然可以訪問這些函數(雖然你不能指望begin()end()給你指針,但有一些方法可以使用&v[0]作爲指針,然後將該大小添加到該指針)。

  • 如果你只需要將數據放入標準算法中,就可以使用指針來做到這一點。

顯然,您不能執行修改數據大小的矢量操作,例如如果有指針,則爲push_back。但是,因爲您有char*而不是const char*,您可以修改成員。