#c #c 11 #boost
Вопрос:
Проблема
У меня есть вектор, содержащий cpp_dec_float_100
значения из boost::multiprecision
библиотеки (т. Е. an std::vector<cpp_dec_float_100>
). Моя цель-преобразовать это в an std::vector<std::string>
(т. Е. Преобразовать cpp_dec_float_100
типы в string
s).
Что я пробовал
boost::exception::to_string()
/boost::lexical_cast<std::string>
: Boost предоставляет некоторые встроенные инструменты для преобразования типов Boost вstd::string
. К сожалению, для этогоcpp_dec_float
требуется высокая точность, чего недостаточно для моих целей. Например,1545596569.76676355
становится1.5456e 09
. Если бы я, например, записал это в файл с помощьюostream
, я бы сохранил полную точность.std::stringstream
Подход: в собственной документации Boost говорится:
Для более сложных преобразований, например, когда точность или форматирование требуют более строгого контроля, чем предусмотрено поведением lexical_cast по умолчанию, рекомендуется использовать обычный подход std::stringstream.
То есть, это:
// std::vector<cpp_dec_float_100> my_vector
// contains my data set
std::ostringstream ss;
std::vector<std::string> my_vector_of_string;
for(int i = 0; i < my_vector.size()-1; i){
ss << setprecision(n) << my_vector[i];
my_vector_of_string.push_back(ss.str());
}
Это работает (и, что не совсем удивительно, дает ту же точность, которую я получаю при записи в файл). Однако (опять же, не совсем удивительно), это невероятно медленно (на самом деле, непрактично, поэтому мои цели) медленно. Мой набор данных включает от десятков до сотен миллионов элементов.
Существует ли более эффективный метод преобразования a cpp_dec_float_100
в std::string
? Меня беспокоит только время, затраченное на это.
Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы или если я упустил что-то важное. Я не очень хорошо знаком с повышением или c
.
Комментарии:
1. Рассмотрим libfmt, повышение кармы или действительно
stringstream
, но оптимизированный путем повторного использования.2. Я совершенно не понимаю, в чем заключается настоящая задача. Я не могу представить себе реальный случай использования, когда вам нужно было бы десятично отформатировать 10 000 000 чисел, но НЕ в файл, а в … вектор строк?
3. На самом деле, если вы можете поделиться программой, содержащей sef, для оптимизации, я оптимизирую ее для вас. Но убедитесь, что образец соответствует вашему требуемому варианту использования, иначе это пустая трата времени
4. @sehe Спасибо за предложения и предложение! Да, это необычная ситуация. По сути , я взаимодействую между функцией, которая обязательно выводит a
vector
ofcpp_dec_float_100
, и функцией, которая записывает данные в собственный формат файла и должна быть передана avector
ofstring
. Я попробую ваши предложения и составлю автономную программу.5. Похоже, что проприетарная запись формата файла (интерфейс) является реальной проблемой. Похоже, что самым большим выигрышем было бы избежать выделения вектора строк. Если у вас есть этот код, я, вероятно, смогу сделать то же самое.