簡體   English   中英

將char *轉換為std :: vector

[英]Cast char* to std::vector

是否有一種快速(CPU)方法將char數組轉換為std::vector<char>

我的功能看起來像這樣:

void someFunction(char* data, int size)
{
    // Now here I need to make the std::vector<char>
    // using the data and size.
}

你不能在這里“施放”任何東西,但你可以很容易地從C字符串構造一個向量:

std::vector<char> v(data, data + size);

這將創建一個副本。

STL容器的一般規則是它們復制其內容。 使用C ++ 11,有一些特殊的方法可以將元素移動到容器中(例如, std::vectoremplace_back()成員函數),但在您的示例中,元素是char對象,因此您仍然會復制每個size char對象。

可以將std::vector視為指向數組的指針的包裝器以及數組的長度。 最近等效的“將char *轉換為std::vector<char> ”是用給定的指針和長度交換向量的指針和長度,但是指定了長度(兩種可能性是指向一個超過末尾的指針) element或size_t值)。 std::vector沒有標准的成員函數可用於將其內部數據與給定的指針和長度交換。

不過,這是有充分理由的。 std::vector為它包含的每個元素實現所有權語義。 它的底層數組分配了一些 allocator(第二個模板參數),默認情況下是std::allocator 如果允許您交換內部成員,則需要確保使用相同的堆分配例程集。 此外,您的STL實現需要修復存儲向量的“長度”的方法,而不是未指定此詳細信息。 在OOP的世界中,指定更多不必要的細節通常是不受歡迎的,因為它可以導致更高的耦合。

但是,假設您的STL實現存在這樣的成員函數。 在您的示例中,您根本不知道data是如何分配的,因此您可能無意中給std::vector指向未使用預期分配器分配的堆內存。 例如,可以使用malloc分配data ,而向量可以通過delete釋放內存。 使用不匹配的分配和釋放例程會導致未定義的行為。 您可能要求someFunction()僅接受使用特定分配例程分配的數據,但這會再次指定不必要的詳細信息。

希望我已經證明了一個交換內部數據成員的std::vector成員函數並不是一個好主意。 如果你真的需要一個來自datasizestd::vector<char> ,你應該構造一個:

std::vector<char> vec(data, data + size);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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