我参加了一个挑战,开门见山地说,在我程序中的一个地方,我需要把字符串转换成整数。我试过boost::lexical_cast,但不幸的是它太慢了。我想是因为它执行的所有检查。我需要的是一些东西,可以在不进行任何检查的情况下执行这种转换(我知道会有有效的数字存储为字符串)。顺便说一句,以朴素的方式使用stringstream:
stringstream interpreter;
interpreter << str;
interpreter >> number;甚至比boost::lexical_cast还要慢。
atoi是唯一的选择吗?
发布于 2011-06-20 01:50:29
您可以使用sscanf完成此任务,但我怀疑它比atoi慢,因为它处理区域设置。
您一定会对阅读这个比atoi更快的简单实现的C++ Convert String to Int Speed基准测试感兴趣。
编辑:另一篇比较不同字符串与整型实现的文章:C++ String to Int。
发布于 2011-06-20 02:30:27
我可以推荐Boost Spirit (与Qi一起解析):
documentation中的
另请参阅my other answer atoi on a character array with lots of integers
。
#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;
}其他
如果可以指定流(文本)格式,请务必查看二进制(反序列化)。有关序列化/反序列化的方法的比较,请参阅我最近的答案here:
)
这篇文章包括基准测试。
发布于 2011-06-20 02:46:42
对于Google Summer of Code,我正在开发一个新的Boost库来解决这个问题;boost::coerce,它可以在here上找到。后端构建在boost::spirit的基础上,通过一个简单得多的接口为您提供了它的所有优势(特别是速度):
int i = boost::coerce::as<int>("23");或
std::string s = boost::coerce::as<std::string>(23);请注意,它仍然是一项正在进行的工作,但在实践中应该足够稳定。如果有什么问题,请告诉我。
https://stackoverflow.com/questions/6404079
复制相似问题