ah that's a really good explanation, thanks so much. After staring at code
for hours, I start to question things like the laws of simply being.
On Tue, Jan 14, 2014 at 11:14 PM, Gavin Lambert
On 15/01/2014 14:46, Quoth Kenneth Adam Miller:
From what I had thought though, if my string was empty with 0's,
Right here's your mistake. string(30000,0) creates a non empty string. It's a string of 30k nulls.
[...]
Ok, so supposing I just use a vector; do I use vector<byte>? Is it more efficient to use vector< word_size_of_computer > since any write to it would obviously be faster or will the compiler catch this? Also, when I grab all of the bytes from vector, does it automatically detect when the end is? Like, one of the purposes of having 0's all through the string was so that it was always terminated. In the case of vector, if I push_back 3 times, and then I output, will I get 3 bytes?
You can still use a string if you want, but you're not initialising the pool correctly.
std::string *p1 = new std::string(30000, 0);
This declaration creates a string that is 30k characters long, where all characters happen to be 0. (It is legal for a string to contain embedded nulls.) If you appended to this string, you would have a 30k+1 character string, and it *might* do a memory allocation. This is obviously not what you want.
std::string *p2 = new std::string(); p2->reserve(30000);
This declaration creates an empty string with an initial capacity of at least 30k characters; if you append a char to it then the string will be 1 char long. It should not allocate any further memory unless you try to append more characters than that. (Though test it, as the STL is permitted to ignore this.)
Also string will automatically ensure that it is always null-terminated when viewed from .c_str(), so you normally don't need to worry about filling with zeroes or anything like that, and you should not try to append a zero yourself unless you actually want that in the string data.
But since you're talking about compressed data here, it will no longer be printable characters and could potentially contain a 0 as actual data. Either vector or string can cope with this just fine (vector is typically more efficient at appending, but less efficient at copying) but either way you'll need to use the .size() to determine how much data is actually in there instead of relying on any termination.
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users