Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cast char* to std::vector

Tags:

c++

char

vector

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.
}
like image 470
Dinoel Vokiniv Avatar asked Nov 28 '22 10:11

Dinoel Vokiniv


2 Answers

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.

like image 91
Bo Persson Avatar answered Dec 05 '22 02:12

Bo Persson


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);
like image 24
Daniel Trebbien Avatar answered Dec 05 '22 03:12

Daniel Trebbien