У меня есть класс, который состоит в основном из матрицы векторов: vector< MyFeatVector<T> > m_vCells
, где внешний вектор представляет матрицу.Каждый элемент в этой матрице - это vector
(я расширил класс stl vector
и назвал его MyFeatVector<T>
).
Я пытаюсь написать эффективный метод для хранения объектов этого класса в двоичных файлах.До сих пор мне требуются три вложенных цикла:
foutput.write( reinterpret_cast<char*>( &(this->at(dy,dx,dz)) ), sizeof(T) );
, где this->at(dy,dx,dz)
возвращает элемент dz
вектора в позиции [dy,dx]
.
Есть ли возможность сохранить приватный элемент m_vCells
без использования циклов?Я пробовал что-то вроде: foutput.write(reinterpret_cast<char*>(&(this->m_vCells[0])), (this->m_vCells.size())*sizeof(CFeatureVector<T>));
, который, кажется, не работает правильно.Мы можем предположить, что все векторы в этой матрице имеют одинаковый размер, хотя приветствуется и более общее решение: -)
Более того, после моей реализации с вложенным циклом, хранение объектов этого класса в двоичных файлах кажетсятребовать больше физического пространства, чем хранить одни и те же объекты в текстовых файлах.Что немного странно.
Я пытался следовать предложению в http://forum.allaboutcircuits.com/showthread.php?t=16465, но не смог найти правильное решение.
Спасибо!
Ниже приведен упрощенный пример моих методов serialization
и unserialization
.
template < typename T >
bool MyFeatMatrix<T>::writeBinary( const string & ofile ){
ofstream foutput(ofile.c_str(), ios::out|ios::binary);
foutput.write(reinterpret_cast<char*>(&this->m_nHeight), sizeof(int));
foutput.write(reinterpret_cast<char*>(&this->m_nWidth), sizeof(int));
foutput.write(reinterpret_cast<char*>(&this->m_nDepth), sizeof(int));
//foutput.write(reinterpret_cast<char*>(&(this->m_vCells[0])), nSze*sizeof(CFeatureVector<T>));
for(register int dy=0; dy < this->m_nHeight; dy++){
for(register int dx=0; dx < this->m_nWidth; dx++){
for(register int dz=0; dz < this->m_nDepth; dz++){
foutput.write( reinterpret_cast<char*>( &(this->at(dy,dx,dz)) ), sizeof(T) );
}
}
}
foutput.close();
return true;
}
template < typename T >
bool MyFeatMatrix<T>::readBinary( const string & ifile ){
ifstream finput(ifile.c_str(), ios::in|ios::binary);
int nHeight, nWidth, nDepth;
finput.read(reinterpret_cast<char*>(&nHeight), sizeof(int));
finput.read(reinterpret_cast<char*>(&nWidth), sizeof(int));
finput.read(reinterpret_cast<char*>(&nDepth), sizeof(int));
this->resize(nHeight, nWidth, nDepth);
for(register int dy=0; dy < this->m_nHeight; dy++){
for(register int dx=0; dx < this->m_nWidth; dx++){
for(register int dz=0; dz < this->m_nDepth; dz++){
finput.read( reinterpret_cast<char*>( &(this->at(dy,dx,dz)) ), sizeof(T) );
}
}
}
finput.close();
return true;
}