2011-10-01 967 views
4

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

我的功能看起來是這樣的:

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

你需要的字符的載體是什麼? – Griwes

回答

15

你不能「投」什麼在這裏,但你可以容易地從C字符串數組:

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

這將創建一個儘管複製。

6

STL容器的一般規則是它們製作其內容的副本。在C++ 11中,有一些將元素移動到容器中的特殊方法(例如,emplace_back()的成員函數std::vector),但在您的示例中,元素是char對象,因此您仍然要將每個sizechar對象。

std::vector想象爲指向數組的指針和數組長度的包裝。 「將char *投射到std::vector<char>」最接近的等效方法是使用給定的指針和長度替換矢量的指針和長度,但是指定了長度(兩種可能性是指向結束元素之後的值的指針或size_t值)。沒有std::vector的標準成員函數,您可以使用它來交換其內部數據與給定的指針和長度。

雖然這是很好的理由。 std::vector爲其包含的每個元素實現所有權語義。其底層陣列分配了一些分配器(第二個模板參數),默認爲std::allocator。如果允許您將內部成員換出,那麼您需要確保使用相同的堆分配例程集。此外,您的STL實現需要修復存儲矢量「長度」的方法,而不是不指定此詳細信息。在面向對象的世界中,指定比所需更多的細節通常會被忽視,因爲它會導致更高的耦合。

但是,假設您的STL實現存在這樣的成員函數。在你的例子中,你根本不知道如何分配data,所以你可能會無意中給出了一個指向堆分配的內存的指針,這個分配器沒有用期望的分配器分配。例如,data可能已被分配爲malloc,而該向量可以用delete釋放內存。使用不匹配的分配和釋放例程會導致未定義的行爲。您可能會要求someFunction()只接受分配給特定分配例程的數據,但這是指定了比必要的更多細節。

希望我已經使我的情況下,一個std::vector成員函數,掉出內部數據成員不是一個好主意。如果你真的需要從datasize一個std::vector<char>,你應該建立一個有:

std::vector<char> vec(data, data + size); 
相關問題