将char*转换为std :: vector

Leo*_*kov 4 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.
}
Run Code Online (Sandbox Code Playgroud)

Bo *_*son 15

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

std::vector<char> v(data, data + size);
Run Code Online (Sandbox Code Playgroud)

这将创建一个副本.


Dan*_*ien 7

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

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

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

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

希望我已经证明std::vector,交换内部数据成员的成员函数不是一个好主意.如果你真的需要一个std::vector<char>from datasize,你应该构建一个:

std::vector<char> vec(data, data + size);
Run Code Online (Sandbox Code Playgroud)