是否有快速(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.
}
答案 0 :(得分:15)
你不能在这里“施放”任何东西,但你可以很容易地从C字符串构建一个矢量:
std::vector<char> v(data, data + size);
这会创建一个副本。
答案 1 :(得分:7)
STL容器的一般规则是它们复制其内容。使用C ++ 11,有一些特殊的方法可以将元素移动到容器中(例如,std::vector
的{{3}}成员函数),但在您的示例中,元素是char
个对象,因此您仍然要复制每个size
char
个对象。
将std::vector
视为指向数组的指针的包装器以及数组的长度。 “将char *
转换为std::vector<char>
”的最接近的等价物是用给定的指针和长度交换向量的指针和长度,但指定长度(两种可能性是指向一个超过结束元素或size_t
值)。没有std::vector
的标准成员函数可用于将其内部数据与给定的指针和长度交换。
但这是有充分理由的。 std::vector
为它包含的每个元素实现所有权语义。其底层数组分配了 some 分配器(第二个模板参数),默认为std::allocator
。如果允许您交换内部成员,则需要确保使用相同的堆分配例程集。此外,您的STL实现需要修复存储向量的“长度”的方法,而不是未指定此详细信息。在OOP的世界中,通常不赞成指定更多细节,因为它可以导致更高的耦合。
但是,假设您的STL实现存在这样的成员函数。在您的示例中,您根本不知道data
是如何分配的,因此您可能会无意中向std::vector
指向未使用预期分配器分配的堆内存。例如,data
可以使用malloc
分配,而向量可以使用delete
释放内存。使用不匹配的分配和释放例程会导致未定义的行为。您可能要求someFunction()
仅接受使用特定分配例程分配的数据,但这会再次指定不必要的详细信息。
希望我已经说明了一个std::vector
成员函数来交换内部数据成员并不是一个好主意。如果您确实需要来自std::vector<char>
和data
的{{1}},则应构建一个:{/ p>
size