Проблема в том, что я хочу сохранить 2D-вектор с плавающей точкой в файле. так как я не знаком с C ++, который становится проблематичным, возможные пути решения:
Какой из двух методов может быть более эффективным с точки зрения скорости?
Я делаю что-то вроде:
std::string serialized;
for (int s = 0; s < (int) mfcc_features_a.size(); s++)
{
for (int t = 0; t < (int) mfcc_features_a[s].size(); t++){
serialized = serialized + "|" + boost::lexical_cast<std::string>(mfcc_features_a[s][t]);
}
}
std::cout << "serialized string is: " << serialized << std::endl;
Хранение двоичных данных может быть несколько быстрее, поскольку данные почти наверняка будут меньше. Разница может быть, а может и не быть существенной для общей эффективности вашей программы: вам нужно измерить, чтобы узнать.
В C ++ 03 ваш код неэффективен. specialized = specialized + "|" + ...
постепенно создает все более и более длинные копии полных данных, по три копии на значение с плавающей запятой. Либо использовать +=
или записать данные непосредственно в поток. В C ++ 11 вы можете решить это, написав specialized = std::move(specialized) + "|" + ...
Хотя двоичный файл, несомненно, будет быстрее выполняться, он может быть проблематичным для кодирования и отладки, так как большинство программистов плохо понимают форматы с плавающей запятой. В этом отношении общее время программирования и выполнения может быть медленнее.
Кроме того, если требуется перенос данных на любой другой компьютер, почти наверняка стоит преобразовать его в универсально читаемый формат.
Хотя не очень C ++, я люблю использовать sprintf
подпрограмма для форматирования значений с плавающей запятой до строки фиксированной ширины (24 символа).
char *pData = new char[vec.size() * 24 + 1];
char *p = pData;
for (size_t i = 0; i < vec.size(); ++i, p += 24)
sprintf(p, "%+.14E\r\n", vec(i));// ... write pData to file ...
delete[] pData;
Удачи!