Re: change vector type?
On 5 okt, 00:19, tf <t...@sci.utah.edu> wrote:
Is there any way I could "change" a vector's type in O(1) time and memory?
I work with a lot of large 3D data, commonly stored raw or close to that
in files. It's common to read such data into a char or unsigned char
array, because of course it's binary data and we're talking bytes at
that level (i.e. istream::read requires it, of course).
After reading such data in, though, I want to process it somehow. I
could always just convert the data:
extern std::vector<char> data;
// external knowledge tells me this is 16bit, unsigned data.
std::vector<unsigned short> typed_data(data.size()/2);
for(size_t i=0; i < data.size()/2; ++i) {
// just pretend the endianness here is fine for a moment.
typed_data[i] = (data[2*i+1] << 8) | (data[2*i]);
}
I can also write my methods to accept unsigned short* and just
reinterpret_cast &data.at(0).
Both are pretty miserable. The first requires a dumb O(n) pass over the
data, and the latter means I can't take advantage of nice C++ features.
The real 'solution' that I tend to adopt is to have methods accept the
'2' above (and the 'external knowledge', typically as template
parameters) as a parameter and reconstruct the type as it performs the
operation. Of course, this basically means that all standard and even
3rd party algorithms are useless in my domain, which is pretty harsh.
I guess what I'd like is some way to say:
extern std::vector<char> data;
std::vector<mytype> typed_data(data.size() / sizeof(mytype));
typed_data.set_pointer(reinterpret_cast<mytype*>(&data[0]));
I'm aware of the lifetime issues I could get into w/ such a situation;
still, that's surely the lesser of two evils here.
Other thoughts?
Why you have that vector<char>? Usually something should serialize
itself from where-ever it serializes. If it is binary stream
containing exact binary layout of array of POD's (some
podType[podsCount] ) then what can be simpler?
extern std::istream from;
std::vector<podType> pods( podsCount );
from.read( reinterpret_cast<char*>(&pods[0]), podsCount *
sizeof(podType) );
Add some sanity/success checks code here ... and done. Sure if the
source is some file that must be useful platform-independently then it
is not at all that simple, but then also your whole problem is "how to
serialize binary data platform-independently" and not "how to change
vector type".
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]