[英]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::vector
的emplace_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
成員函數並不是一個好主意。 如果你真的需要一個來自data
和size
的std::vector<char>
,你應該構造一個:
std::vector<char> vec(data, data + size);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.