首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将char*强制转换为std::vector

将char*强制转换为std::vector
EN

Stack Overflow用户
提问于 2011-10-01 19:02:37
回答 2查看 6.6K关注 0票数 4

有没有一种将char数组转换为std::vector<char>的快速方法

我的函数如下所示:

代码语言:javascript
运行
复制
void someFunction(char* data, int size)
{
    // Now here I need to make the std::vector<char>
    // using the data and size.
}
EN

回答 2

Stack Overflow用户

发布于 2011-10-01 19:08:21

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

代码语言:javascript
运行
复制
std::vector<char> v(data, data + size);

这将创建一个副本。

票数 16
EN

Stack Overflow用户

发布于 2011-10-01 19:42:19

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

可以将std::vector看作是指向数组的指针和数组长度的包装。与“将char *转换为std::vector<char>”最接近的等价物是将向量的指针和长度换成给定的指针和长度,而不管长度是如何指定的(有两种可能,一种是指向超过end元素的指针,另一种是size_t值)。std::vector没有标准的成员函数可以用来用给定的指针和长度交换其内部数据。

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

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

希望我已经说明了,交换内部数据成员的std::vector成员函数不是一个好主意。如果您确实需要来自datasizestd::vector<char>,则应使用以下命令构建一个:

代码语言:javascript
运行
复制
std::vector<char> vec(data, data + size);
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7619806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档