将char *转换为std :: vector

时间:2011-10-01 11:02:37

标签: c++ vector char

是否有快速(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.
}

2 个答案:

答案 0 :(得分:15)

你不能在这里“施放”任何东西,但你可以很容易地从C字符串构建一个矢量:

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

这会创建一个副本。

答案 1 :(得分:7)

STL容器的一般规则是它们复制其内容。使用C ++ 11,有一些特殊的方法可以将元素移动到容器中(例如,std::vector的{​​{3}}成员函数),但在您的示例中,元素是char个对象,因此您仍然要复制每个size char个对象。

std::vector视为指向数组的指针的包装器以及数组的长度。 “将char *转换为std::vector<char>”的最接近的等价物是用给定的指针和长度交换向量的指针和长度,但指定长度(两种可能性是指向一个超过结束元素或size_t值)。没有std::vector的标准成员函数可用于将其内部数据与给定的指针和长度交换。

但这是有充分理由的。 std::vector为它包含的每个元素实现所有权语义。其底层数组分配了 some 分配器(第二个模板参数),默认为std::allocator。如果允许您交换内部成员,则需要确保使用相同的堆分配例程集。此外,您的STL实现需要修复存储向量的“长度”的方法,而不是未指定此详细信息。在OOP的世界中,通常不赞成指定更多细节,因为它可以导致更高的耦合。

但是,假设您的STL实现存在这样的成员函数。在您的示例中,您根本不知道data是如何分配的,因此您可能会无意中向std::vector指向未使用预期分配器分配的堆内存。例如,data可以使用malloc分配,而向量可以使用delete释放内存。使用不匹配的分配和释放例程会导致未定义的行为。您可能要求someFunction()仅接受使用特定分配例程分配的数据,但这会再次指定不必要的详细信息。

希望我已经说明了一个std::vector成员函数来交换内部数据成员并不是一个好主意。如果您确实需要来自std::vector<char>data的{​​{1}},则应构建一个:{/ p>

size