Is there a fast (CPU) way to cast a char
array into a std::vector<char>
?
My function looks like this:
void someFunction(char* data, int size)
{
// Now here I need to make the std::vector<char>
// using the data and size.
}
Is there a fast (CPU) way to cast a char
array into a std::vector<char>
?
My function looks like this:
void someFunction(char* data, int size)
{
// Now here I need to make the std::vector<char>
// using the data and size.
}
You can't "cast" anything here, but you can easily construct a vector from the C string:
std::vector<char> v(data, data + size);
This will create a copy though.
The general rule with STL containers is that they make copies of their contents. With C++11, there are special ways of moving elements into a container (for example, the emplace_back()
member function of std::vector
), but in your example, the elements are char
objects, so you are still going to copy each of the size
char
objects.
Think of a std::vector
as a wrapper of a pointer to an array together with the length of the array. The closest equivalent of "casting a char *
to a std::vector<char>
" is to swap out the vector's pointer and length with a given pointer and length however the length is specified (two possibilities are a pointer to one past the end element or a size_t
value). There is no standard member function of std::vector
that you can use to swap its internal data with a given pointer and length.
This is for good reason, though. std::vector
implements ownership semantics for every element that it contains. Its underlying array is allocated with some allocator (the second template parameter), which is std::allocator
by default. If you were allowed to swap out the internal members, then you would need to ensure that the same set of heap allocation routines were used. Also, your STL implementation would need to fix the method of storing "length" of the vector rather than leaving this detail unspecified. In the world of OOP, specifying more details than necessary is generally frowned upon because it can lead to higher coupling.
But, assume that such a member function exists for your STL implementation. In your example, you simply do not know how data
was allocated, so you could inadvertently give a std::vector
a pointer to heap memory that was not allocated with the expected allocator. For example, data
could have been allocated with malloc
whereas the vector could be freeing the memory with delete
. Using mismatched allocation and deallocation routines leads to Undefined Behavior. You might require that someFunction()
only accept data allocated with a particular allocation routine, but this is specifying more details than necessary again.
Hopefully I have made my case that a std::vector
member function that swaps out the internal data members is not a good idea. If you really need a std::vector<char>
from data
and size
, you should construct one with:
std::vector<char> vec(data, data + size);