Здравствуйте, sqborev, Вы писали:
S>Привет!
S>Вот тут задался вопросом: "Нормально ли это?". Кажется, что не особо хорошо.
S>
S>int col=boost::lexical_cast<int>(str);
S>
S>Или может есть что-то побыстрее и не менее красивое. atoi не предлагать
S>Хочется , чтобы преобразование было всетаки в стиле С++, а не С
S>Что посоветуете? stringstream? ну это поидее тоже самое, что и lexical_cast, только своими руками...
stringstream тут причем?
S>Нужно что-то красивое и не очень медленное
Здравствуйте, c-smile, Вы писали:
S>>Хочется , чтобы преобразование было всетаки в стиле С++, а не С
S>>Что посоветуете? stringstream? ну это поидее тоже самое, что и lexical_cast, только своими руками...
CS>stringstream тут причем?
Ну я вот только что открыл файлик lexical_cast.hpp и там вот как
Ну а вообще, читал это здесь Саттер Г. — Новые сложные задачи на C++ — страница 35
S>>Нужно что-то красивое и не очень медленное
CS>atoi() — скромное обаяние классики.
Здравствуйте, sqborev, Вы писали:
S>Здравствуйте, c-smile, Вы писали:
S>>>Хочется , чтобы преобразование было всетаки в стиле С++, а не С
S>>>Что посоветуете? stringstream? ну это поидее тоже самое, что и lexical_cast, только своими руками...
CS>>stringstream тут причем?
S>Ну я вот только что открыл файлик lexical_cast.hpp и там вот как
S>
И чего? Зачем для atoi нужен stream?
S>Ну а вообще, читал это здесь Саттер Г. — Новые сложные задачи на C++ — страница 35
S>>>Нужно что-то красивое и не очень медленное
CS>>atoi() — скромное обаяние классики.
S>Классика С S>А хочется С++
С runtime library is a part of C++ runtime. Это так, для справки
Здравствуйте, sqborev, Вы писали:
S>Привет!
S>Вот тут задался вопросом: "Нормально ли это?". Кажется, что не особо хорошо.
S>
S>int col=boost::lexical_cast<int>(str);
S>
S>Или может есть что-то побыстрее и не менее красивое. atoi не предлагать
S>Хочется , чтобы преобразование было всетаки в стиле С++, а не С
S>Что посоветуете? stringstream? ну это поидее тоже самое, что и lexical_cast, только своими руками... S>Нужно что-то красивое и не очень медленное
Если хочешь заморочиться, то вот:
#include <string>
#include"boost/spirit/core/scanner/scanner.hpp"#include"boost/spirit/core/primitives/numerics.hpp"template <class IteratorT>
IteratorT string2int(IteratorT first, IteratorT last, int& val)
{
namespace bs = boost::spirit;
typedef bs::scanner<IteratorT, bs::scanner_policies<> > scanner_type;
typedef bs::int_parser<int> parser_type;
typedef typename bs::parser_result<parser_type, scanner_type>::type result_type;
scanner_type scan(first, last);
if (result_type result = bs::int_p.parse(scan))
val = result.value();
return scan.first;
}
int main()
{
std::string str= "123vs";
int n = 0;
string2int(str.begin(), str.end(), n);
return 0;
}
S>>Что посоветуете? stringstream? ну это поидее тоже самое, что и lexical_cast, только своими руками... S>>Нужно что-то красивое и не очень медленное
KP>Если хочешь заморочиться, то вот: KP>
KP>а так ещё есть хорошая функция strtol
KP>Замеры скорости можешь сам сделать.
KP>Когда то кстати я делал замеры скорости функций парсинга строки в double и что интересно boost::spirit::real_p был быстрее библиотечной strtod.
Ну на стр2инт всего сторчки 3 нужно на чистом С
for(int v,poz;?;poz++)
v=v*10+str[poz];
Ну еще знаки, полюбому короче чем с boost
Смысл lexical_cast чтоб использовать готовые операторы << а скорость string2int известна
lexical_cast не удачна имхо, нужно возвращать по ссылке чтоб тип определялся, ну и вообще не юзабельна, как и strlen, потому как без контроля. Я обычно sscanf( ,"%d%c" ) пользую, но это на одно поле , к сожалению sscanf не возвращает конец.
А скорость меряли
#include <iostream>
#include <utility>
#include <string>
#include <vector>
#include <fstream>
#include <algorithm>
#include <set>
#include <sstream>
int main (int, char**)
{
FILE *fi=fopen("123.tmp","wt");
enum {BN=500000};
int j; char bb[BN+5];
for(j=BN;j--;)
fputc('0',fi);
fputs("--\n",fi);
fclose(fi);
fi=fopen("123.tmp","rt");
fgets(bb,BN+3,fi);
j=strlen(bb);
fclose(fi);
std::ifstream in("123.tmp");
std::string is;
getline(in,is); // уходит в себя надолго
j=is.size();
}
std::ifstream 1 мегабайт в минуту. вот и можно прикинуть для каких размеров файлов подходит ifstream А скорость string2int побарабану, если оно конечно не делается через stringstream
Здравствуйте, Аноним, Вы писали:
А>Все остальное — малоосмысленный набор двоеточий, угловых скобок и букв, в написании которых полностью отсутствует выполняемое действие...
atoi слишком примитивна, плохая диагностика исключительных ситуаций. strtol в этом плане получше будет.
Здравствуйте, Sni4ok, Вы писали:
S>при том, что boost::lexical_cast был изначально простой обёрткой над std::stringstream, S>в последних версиях вроде что-то поменялось.
S>Что посоветуете? stringstream? ну это поидее тоже самое, что и lexical_cast, только своими руками... S>Нужно что-то красивое и не очень медленное
Плюсы lexical_cast перед atoi, atol,atof:
1. Типизация
Можно например делать lexical_cast<long long>()
Что-то я не припомню в ANSI C atoll()
2. Исключение при неправильном формате.
Минус один — скорость.
lexical_cast существенно медленнее atoi
В своё время я специально тестировал. Точно не помню, кажется получалось где-то в 5-10 раз медленнее.
Использовать что-то другое плюсовое бесполезно. Как уже говорили lexical_cast просто обёртка над
string_stream. И работает с такой же скоростью (я тоже проверял)
Когда у меня стоял выбор я остановился всё же на lexical_cast, хотя конвертить надо довольно много, потому что:
1. Мне нужна проверка ошибок
2. Рано или поздно lexical_cast оптимизируют тем же atol, специализацией шаблонов это сделать раз плюнуть.
Согласен с остальным, красоты тут нет никакой. Используете в зависимости от того, что вам важнее.
Здравствуйте, alnsn, Вы писали:
A>Здравствуйте, Sni4ok, Вы писали:
S>>при том, что boost::lexical_cast был изначально простой обёрткой над std::stringstream, S>>в последних версиях вроде что-то поменялось.
A>Ага, я кое-что подкрутил, лежит в HEAD. A>Вот http://accu.org/index.php/journals/1375 подробно объясняется.
P> A typical call of this function would look like this:
P>s += itoa(n).elems;
А почему не boost::array? Да и assume можно было бы выразить и более уверенно, в виде BOOST_STATIC_ASSERT, или автоматически выбирать размер. Или это только пример из журнала, а внутри иначе?
P>да так като поудобней будет, без bost::::::::elems P>
P>Минус 2 <тип> нужно прописывать, при смене типа по всем кастам пройтись нужно
Меня кстати тоже удивил подобный дизайн.
Незнаю почему они так сделали, может из-за наглядности, может есть какие-то более глубокие причины.
В любом случае это легко поправить.
P.S. А atoi не привязан к конкретному типу? Там при смене типа нужно вообще название изменить.
А тип хоть typedef'ом можно обяъвить, если есть опастность смены.
Здравствуйте, Roman Odaisky, Вы писали:
RO>Здравствуйте, Programador, Вы писали:
A>>>Ага, я кое-что подкрутил, лежит в HEAD. A>>>Вот http://accu.org/index.php/journals/1375 подробно объясняется. P>>
P>> A typical call of this function would look like this:
P>>s += itoa(n).elems;
RO>А почему не boost::array? Да и assume можно было бы выразить и более уверенно, в виде BOOST_STATIC_ASSERT, или автоматически выбирать размер. Или это только пример из журнала, а внутри иначе?
Именно boost::array возврашается boost::array::elems используется
P>>да так като поудобней будет, без bost::::::::elems P>>
RO>Ты с дубу рухнул? S12() окончит свое существование очень быстро, в любом случае раньше, чем юзер успеет использовать результат.
Да такоеже время жизни как и у возвращенного boost::array до первой; покороче чем у внутреннего статического буфера, зато так можно