将char*转换为std::vector

4

有没有一种快速(使用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.
}

3
你需要一个 char 向量的目的是什么? - Griwes
2个回答

16

在这里你不能对任何东西进行“转换”,但你可以轻松地从C字符串构建一个向量:

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

这会创建一个副本。


8
STL容器的一般规则是它们会复制其内容。在C++11中,有特殊的方法将元素移入容器(例如,std::vectoremplace_back()成员函数),但在您的示例中,元素是char对象,因此仍然会复制每个size char对象。
std::vector视为指向数组的指针和数组长度的包装器。将"将char *强制转换为std::vector<char>"最接近的等效方法是使用给定的指针和长度交换向量的指针和长度,但是长度如何指定不确定(两种可能性是指向超出末尾元素的指针或size_t值)。没有标准的std::vector成员函数可用于交换其内部数据和给定的指针和长度。
这是有充分理由的。std::vector为其包含的每个元素实现了所有权语义。它的底层数组使用某些分配器(第二个模板参数)进行分配,默认情况下使用std::allocator。如果允许替换内部成员,那么您需要确保使用相同的堆分配例程集。此外,您的STL实现需要确定矢量存储“长度”的方法,而不是保留此细节未指定。在面向对象编程领域中,通常会反对指定比必要更多的细节,因为这可能导致耦合度更高。
但假设您的STL实现存在这样的成员函数。在您的示例中,您根本不知道data是如何分配的,因此可能会无意中将一个指向未使用预期分配器进行分配的堆内存的指针赋给std::vector。例如,data可能是使用malloc分配的,而向量可能使用delete释放内存。使用不匹配的分配和释放例程会导致未定义行为。您可能需要仅接受使用特定分配例程进行分配的数据的someFunction(),但这再次指定了比必要更多的细节。
希望我已经说明了一个交换内部数据成员的 std::vector 成员函数不是一个好主意。如果您真的需要从 datasize 构造一个 std::vector<char>,您应该使用以下方式构造一个:
std::vector<char> vec(data, data + size);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接