[英]Alternative to boost::lexical_cast
我正在参与挑战,只是为了切入点,在我的程序中的一个地方我需要将字符串转换为整数。 我已经尝试过boost :: lexical_cast,但不幸的是它是sooo sloowwww。 我想因为它执行的所有检查。 我需要的是能够在没有任何检查的情况下执行此转换的内容(我知道将有效数字存储为字符串)。 顺便使用stringstream以天真的方式:
stringstream interpreter;
interpreter << str;
interpreter >> number;
甚至比boost :: lexical_cast慢。
atoi是唯一的选择吗?
你可以使用sscanf
来做,但我怀疑它比atoi
处理语言环境要慢。
你肯定会有兴趣阅读这个C ++ Convert String to Int Speed基准测试,它具有比atoi
更快的天真实现。
编辑:另一篇文章将不同的字符串与int实现进行比较: C ++ String to Int 。
我可以推荐Boost Spirit(用Qi解析):
。
#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;
const char *demo1 = "1234";
const char *demo2 = "1234,2345,-777,-888";
const char *demo3 = " 1234 , 2345 , -777, -888 ";
void do_demo1()
{
const char *begin = demo1;
const char *iter = begin;
const char *end = demo1+strlen(demo1);
int result;
if (qi::parse(iter, end, qi::int_, result))
std::cout << "result = " << result << std::endl;
else
std::cout << "parse failed at #" << (iter - begin) << ": " << std::string(iter, end) << std::endl;
//// to allow for spaces, use phrase_parse instead of parse
// if (qi::phrase_parse(begin, end, qi::int_, qi::space, result)
//// ... etc
}
void do_demo2()
{
const char *begin = demo2;
const char *iter = begin;
const char *end = demo2+strlen(demo2);
std::vector<int> results;
if (qi::parse(iter, end, qi::int_ % ',', results))
std::cout << "results = " << results.size() << std::endl;
else
std::cout << "parse failed at #" << (iter - begin) << ": " << std::string(iter, end) << std::endl;
}
void do_demo3()
{
const char *begin = demo3;
const char *iter = begin;
const char *end = demo3+strlen(demo3);
std::vector<int> results;
if (qi::phrase_parse(iter, end, qi::int_ % ',', qi::space, results))
std::cout << "results = " << results.size() << std::endl;
else std::cout << "parse failed at #" << (iter - begin) << ": " << std::string(iter, end) << std::endl;
}
int main()
{
do_demo1();
do_demo2();
do_demo3();
return 0;
}
请务必查看二进制(反)序列化IFF,您可以指定流(文本)格式。 请参阅我最近的答案,以便比较针对序列化/反序列化的方法:
那篇文章包括基准
对于Google Summer of Code,我正在开发一个新的Boost库来解决这个问题。 可以在这里找到的boost :: coerce。 后端以boost :: spirit为基础,通过更简单的界面为您提供所有优势(特别是速度):
int i = boost::coerce::as<int>("23");
要么
std::string s = boost::coerce::as<std::string>(23);
请注意,它仍在进行中,但在实践中应该足够稳定。 如果出现任何问题,请告诉我。
strtol可以是更好的atoi(特别是wrt错误处理),并且比lexical_cast更快。
atoi / itoa函数通常更快,sscanf()也是如此。
所有这些都来自c运行时,但它们应该适合你。
如何使用stoi()。 我确信它必须足够快以满足您的需求。
如果你真的不需要做任何检查,最快的方法就是自己转换字符串。 我的意思是编码这样的代码:
int integer_from(string s)
{
int n = 0;
for (string::const_iterator it = s.begin(); it != s.end(); it++)
{
n = 10*n + (*it) - '0';
}
return n;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.