2011-10-01 165 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); 
相关问题