有没有一种将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.
}
发布于 2011-10-01 19:08:21
在这里你不能“强制转换”任何东西,但是你可以很容易地从C字符串构造一个向量:
std::vector<char> v(data, data + size);
这将创建一个副本。
发布于 2011-10-01 19:42:19
STL容器的一般规则是复制其内容。对于C++11,有一些特殊的方法可以将元素移动到容器中(例如,std::vector
的emplace_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
成员函数不是一个好主意。如果您确实需要来自data
和size
的std::vector<char>
,则应使用以下命令构建一个:
std::vector<char> vec(data, data + size);
https://stackoverflow.com/questions/7619806
复制相似问题