Я (намереваясь) использовать код в this answer, чтобы прочитать что-то из CSV. По сути, я получаю итератор для строк между последовательными ,
символами; но вместо того, чтобы помещать их в вектор строк, я хочу проанализировать эти строки на элементы (произвольного) типа T, которые исходят из аргумента шаблона. Так что ...Как избежать повторяющейся конструкции istringstream при преобразовании потока токенов строки
template <typename T>
void foo(const std::string& line)
{
// ....
std::vector<T> vec;
using namespace boost;
tokenizer<escaped_list_separator<char> > tk(
line, escaped_list_separator<char>('\\', ',', '\"'));
for (tokenizer<escaped_list_separator<char> >::iterator i(tk.begin());
i!=tk.end();++i)
{
/* magic goes here */
}
Я мог бы использовать istringstream` (например, как это было предложено here):
std::istringstream iss(*i);
T t; iss >> t;
vec.push_back(t);
Но это излишеством (и я мог бы строить два или даже три раза здесь). Если C++ был std::from_string()
как его std::to_string
, то я бы просто сделать
vec.emplace_back(std::from_string(*i));
но не существует. Возможно boost::lexical_cast
? Я бы предпочел использовать что-то стандартное.
Что мне делать вместо этого?
только «общий» способ создать что-то как функция 'from_string' * есть * со строковыми потоками, и на самом деле работает' boost :: lexical_cast'. Конечно, он полагается на тип ('T', что бы это ни было), чтобы иметь соответствующую перегрузку' operator >> '. У вас могут быть специальные специализации для таких вещей, как номера, например, 'strtod' или' stoi'), но кроме этого нет возможности избежать сцеплений 'istringstream'. –
Даже если существовала функция 'from_string', я не вижу, чтобы она делала большую часть улучшения производительности/пространства. Просто 2-3-х дополнительных операций, в результате чего общий O (n). Чистый код мудрый, вы можете просто инкапсулировать свой собственный шаблон 'from_string' через' sstream'. – aybassiouny
@aybassiouny: 1. Вы имеете в виду from_string. 2. Строка istringstream, возможно, требует некоторой конструкции 3. Строка istringstream делает свое собственное подглядывание, токенизацию, сохраняя следующую неиспользованную позицию и т. Д., В то время как в моем случае я знаю, что во всей строке есть только одно значение. Я уверен, что в этом есть преимущество в производительности. – einpoklum