Проверка vector<char> на "читаемось"
От: dosik Россия www.dosik.ru
Дата: 06.06.16 14:58
Оценка:
Есть задача загнать вектор в строку, но при этом быть уверенным, что в векторе действительно находятся "читаемые и печатаемые" символы.
Первое, что пришло в голову:
    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;
    }

Быть может есть что-то более элегантное и быстрое?
Re: Проверка vector<char> на "читаемось"
От: jahr  
Дата: 06.06.16 15:52
Оценка: :)
Здравствуйте, 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);});
Отредактировано 06.06.2016 15:52 jahr . Предыдущая версия .
Re[2]: Проверка vector<char> на "читаемось"
От: dosik Россия www.dosik.ru
Дата: 06.06.16 16:06
Оценка:
Здравствуйте, 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());

на случай "сильно гигантского" буфера, чтобы не происходили переаллокации при копировании.
Re: Проверка vector<char> на "читаемось"
От: watchmaker  
Дата: 06.06.16 16:12
Оценка:
Здравствуйте, dosik, Вы писали:

D>Есть задача загнать вектор в строку, но при этом быть уверенным, что в векторе действительно находятся "читаемые и печатаемые" символы.


D>Быть может есть что-то более элегантное

Это же работа с текстом — тут не бывает ничего элегантного!
Твой вариант, например, может очень плохо работать со строчкой в utf-8, несмотря на то, что она вся может состоять из «читаемых и печатных» символов.
Но если твоя локаль входит в список поддерживаемых std::isprint, то такой вариант проверки вполне жизнеспособен.

D>и быстрое


Пока профайлер не показал в этом месте проблем, не стоит и пытаться что-то ускорять. Добейся лучше сначала элегантности
А то ведь обработка текста на векторных инструкциях работает быстро, но выглядит ужасно и неподдерживаемо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.