This question is related to, but not quite the same as, this question.
Are there any benefits to using std::vector<char>
instead of std::string
to hold arbitrary binary data, aside from readability-related issues?
i.e. Are there any tasks which are easier/more efficient/better to perform with a vector compared to a string?
These are interchangeable, std::string just offers additional functionality.
h functions when you are declaring string with std::string keyword because std::string strings are of basic_string class type and cstring strings are of const char* type. Pros: When dealing exclusively in C++ std:string is the best way to go because of better searching, replacement, and manipulation functions.
TLDR: string s are optimized to only contain character primitives, vector s can contain primitives or objects. The preeminent difference between vector and string is that vector can correctly contain objects, string works only on primitives.
If you need a "dynamic" array, then std::vector is the natural solution. It should in general be the default container for everything. But if you want a statically sized array created at time of compilation (like a C-style array is) but wrapped in a nice C++ object then std::array might be a better choice.
Aside from readability (which should not be underestimated) I can think of a couple of minor performance/memory issues with using std::string
over std::vector
:
Some modern std::string
implementations use the small string optimization. If you are storing data that's larger than the string
's internal buffer, it becomes a pessimization, reducing the efficiency of copying, moving, and swap
1 and increasing the sizeof()
for no benefit.
An efficient std::string
implementation will always allocate at least 1 more byte than the current size for storing a terminating null (not doing so requires extra logic in operator[]
to cope with str[size()]
).
I should stress that both of these issues are very minor; the performance cost of them will more than likely be lost in the background noise. But you did ask.
1Those operations require branching on size()
if the small string optimization is being used, whereas they don't in a good std::vector
implementation.
Beyond readability, and ensuring another maintainer does not confuse the purpose of the std::string
, there is not a lot of difference in function. You could of course consider char*/malloc as well, if efficiency is the only consideration.
One potential issue I can think of:
std::string
defaults to storing <char>
. If you later needed to handle another type (e.g. unsigned short) you might need to either:
std::basic_string<unsigned short>
(which moves you away from normal std::string
handling)With a vector you could simply change the container to a std::vector<unsigned short>
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With