将 char* 转换为 std::vector

Posted

技术标签:

【中文标题】将 char* 转换为 std::vector【英文标题】:Cast char* to std::vector 【发布时间】:2011-10-01 11:02:36 【问题描述】:

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

【问题讨论】:

你需要一个字符向量做什么? 【参考方案1】:

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

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

这将创建一个副本。

【讨论】:

【参考方案2】:

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

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

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

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

希望我已经证明了一个替换内部数据成员的std::vector 成员函数不是一个好主意。如果你真的需要来自datasizestd::vector&lt;char&gt;,你应该构造一个:

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

【讨论】:

以上是关于将 char* 转换为 std::vector的主要内容,如果未能解决你的问题,请参考以下文章

如何将 unsigned char[] 转换为 std::vector<unsigned char>

C++ - 将 char 引用转换为 bool 引用(std::vector<bool>)

如何将 std::vector<std::string> 转换为 C api 的 char*[] [重复]

将 std::string 的向量转换为 char***

qt怎么把char[转为vector

如何使用多次 memcpy 转换回 std::vector<unsigned char>?