将char *转换为std :: vector
是否有快速(CPU)方法将char
数组转换为std::vector<char>
?将char *转换为std :: vector
我的功能看起来是这样的:
void someFunction(char* data, int size)
{
// Now here I need to make the std::vector<char>
// using the data and size.
}
你不能“投”什么在这里,但你可以容易地从C字符串数组:
std::vector<char> v(data, data + size);
这将创建一个尽管复制。
STL容器的一般规则是它们制作其内容的副本。在C++ 11中,有一些将元素移动到容器中的特殊方法(例如,emplace_back()
的成员函数std::vector
),但在您的示例中,元素是char
对象,因此您仍然要将每个size
char
对象。
将std::vector
想象为指向数组的指针和数组长度的包装。 “将char *
投射到std::vector<char>
”最接近的等效方法是使用给定的指针和长度替换矢量的指针和长度,但是指定了长度(两种可能性是指向结束元素之后的值的指针或size_t
值)。没有std::vector
的标准成员函数,您可以使用它来交换其内部数据与给定的指针和长度。
虽然这是很好的理由。 std::vector
为其包含的每个元素实现所有权语义。其底层阵列分配了一些分配器(第二个模板参数),默认为std::allocator
。如果允许您将内部成员换出,那么您需要确保使用相同的堆分配例程集。此外,您的STL实现需要修复存储矢量“长度”的方法,而不是不指定此详细信息。在面向对象的世界中,指定比所需更多的细节通常会被忽视,因为它会导致更高的耦合。
但是,假设您的STL实现存在这样的成员函数。在你的例子中,你根本不知道如何分配data
,所以你可能会无意中给出了一个指向堆分配的内存的指针,这个分配器没有用期望的分配器分配。例如,data
可能已被分配为malloc
,而该向量可以用delete
释放内存。使用不匹配的分配和释放例程会导致未定义的行为。您可能会要求someFunction()
只接受分配给特定分配例程的数据,但这是指定了比必要的更多细节。
希望我已经使我的情况下,一个std::vector
成员函数,掉出内部数据成员不是一个好主意。如果你真的需要从data
和size
一个std::vector<char>
,你应该建立一个有:
std::vector<char> vec(data, data + size);
你需要的字符的载体是什么? – Griwes