首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost::lexical_cast的替代方案

boost::lexical_cast的替代方案
EN

Stack Overflow用户
提问于 2011-06-20 01:47:38
回答 7查看 9.9K关注 0票数 13

我参加了一个挑战,开门见山地说,在我程序中的一个地方,我需要把字符串转换成整数。我试过boost::lexical_cast,但不幸的是它太慢了。我想是因为它执行的所有检查。我需要的是一些东西,可以在不进行任何检查的情况下执行这种转换(我知道会有有效的数字存储为字符串)。顺便说一句,以朴素的方式使用stringstream:

代码语言:javascript
复制
stringstream interpreter;
interpreter << str;
interpreter >> number;

甚至比boost::lexical_cast还要慢。

atoi是唯一的选择吗?

EN

回答 7

Stack Overflow用户

发布于 2011-06-20 01:50:29

您可以使用sscanf完成此任务,但我怀疑它比atoi慢,因为它处理区域设置。

您一定会对阅读这个比atoi更快的简单实现的C++ Convert String to Int Speed基准测试感兴趣。

编辑:另一篇比较不同字符串与整型实现的文章:C++ String to Int

票数 19
EN

Stack Overflow用户

发布于 2011-06-20 02:30:27

我可以推荐Boost Spirit (与Qi一起解析):

documentation中的

  1. 一些基准测试

另请参阅my other answer atoi on a character array with lots of integers

  • some sample

代码语言:javascript
复制
#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

  • STL (未加修饰的ANSI C++98标准
    • (以上)
    • Boost Serialization

    )

这篇文章包括基准测试。

票数 12
EN

Stack Overflow用户

发布于 2011-06-20 02:46:42

对于Google Summer of Code,我正在开发一个新的Boost库来解决这个问题;boost::coerce,它可以在here上找到。后端构建在boost::spirit的基础上,通过一个简单得多的接口为您提供了它的所有优势(特别是速度):

代码语言:javascript
复制
int i = boost::coerce::as<int>("23");

代码语言:javascript
复制
std::string s = boost::coerce::as<std::string>(23);

请注意,它仍然是一项正在进行的工作,但在实践中应该足够稳定。如果有什么问题,请告诉我。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6404079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档