Есть задача загнать вектор в строку, но при этом быть уверенным, что в векторе действительно находятся "читаемые и печатаемые" символы.
Первое, что пришло в голову:
std::vector<char> buff;
// Get data to vector
bool ischars = true;
for (char ch : buff) {
ischars = std::isprint(ch) || std::isspace(ch)';
if (!ischars)
break;
}
Быть может есть что-то более элегантное и быстрое?
Здравствуйте, dosik, Вы писали:
D>Быть может есть что-то более элегантное и быстрое?
Не знаю, насколько это элегантно-быстро, но есть такой способ, например:
using namespace std;
vector<char> buf;
// fill data
string res;
copy_if(buf.begin(), buf.end(), back_inserter(res), [](char c){ return isprint(c) || isspace(c);});
Здравствуйте, jahr, Вы писали:
J>Здравствуйте, dosik, Вы писали:
D>>Быть может есть что-то более элегантное и быстрое?
J>Не знаю, насколько это элегантно-быстро, но есть такой способ, например:
J>J>using namespace std;
J>vector<char> buf;
J>// fill data
J>string res;
J>copy_if(buf.begin(), buf.end(), back_inserter(res), [](char c){ return isprint(c) || isspace(c);});
J>
Двух зайцев одним выстрелом ))) Интересно!
Единственное, что добавил бы:
res.reserve(buf.size());
на случай "сильно гигантского" буфера, чтобы не происходили переаллокации при копировании.
Здравствуйте, dosik, Вы писали:
D>Есть задача загнать вектор в строку, но при этом быть уверенным, что в векторе действительно находятся "читаемые и печатаемые" символы.
D>Быть может есть что-то более элегантное
Это же работа с текстом — тут не бывает ничего элегантного!
Твой вариант, например, может очень плохо работать со строчкой в utf-8, несмотря на то, что она вся может состоять из «читаемых и печатных» символов.
Но если твоя локаль входит в список поддерживаемых std::isprint, то такой вариант проверки вполне жизнеспособен.
D>и быстрое
Пока профайлер не показал в этом месте проблем, не стоит и пытаться что-то ускорять. Добейся лучше сначала элегантности
А то ведь обработка текста на векторных инструкциях работает быстро, но выглядит ужасно и неподдерживаемо.