gpt4 book ai didi

c++ - float <-> std::string 转换替代方案?

转载 作者:可可西里 更新时间:2023-11-01 17:58:55 24 4
gpt4 key购买 nike

有没有atofstrtodlexical_caststringstreamsprintf ?

即:

  1. C++ 方式(std::string 而不是 char*)
  2. 安全(无缓冲区溢出风险)
  3. 有效(如果无法进行转换则返回NaN)
  4. 没有外部图书馆(独立)

我更喜欢this , 一个简单的函数,经过优化,切中要点

原因:

  • atofstrtod 是 C 函数,它们在失败时不返回 NaN,我更喜欢使用 std::string ,所以我只是问是否有人已经为我可以使用的 std::string 编写了一些包装器(如果您不介意的话)。
  • lexical_cast 具有增强依赖性
  • stringstream 很慢
  • sprintf存在缓冲区溢出风险及其C函数

最佳答案

我会看看 Boost Spirit

至少格式化程序(即 float -> 字符串)的基准始终是最重要的*1*

还可以使用策略类很好地配置解析时的确切输入格式规范和语义。


这是我对 qi::any_real_parser<> 的绝对最小依赖使用及其涉及的依赖列表:

#include <boost/spirit/include/qi_real.hpp>

namespace qi = boost::spirit::qi;

int main()
{
const char input[] = "3.1415926";
const char *f(input);
const char *l(f+strlen(input));

qi::any_real_parser<double> x;
double parsed;
x.parse(f, l, qi::unused, qi::unused, parsed);

return 0;
}

<子>

  • boost/concept
  • boost/config
  • boost/detail
  • boost/exception
  • boost/fusion
  • boost/iterator
  • boost/math
  • boost/mpl
  • boost/optional
  • boost/preprocessor
  • boost/proto
  • boost/range
  • boost/regex
  • boost/spirit
  • boost/typeof
  • boost/type_traits
  • boost/utility
  • boost/variant

aligned_storage.hpp,assert.hpp,blank_fwd.hpp,blank.hpp,call_traits.hpp,checked_delete.hpp,concept_check.hpp,config.hpp,cstdint.hpp,current_function.hpp,foreach_fwd.hpp,foreach.hpp,get_pointer.hpp,implicit_cast.hpp,iterator.hpp,limits.hpp,math_fwd.hpp,next_prior.hpp,noncopyable.hpp,none.hpp,none_t.hpp,optional.hpp,ref.hpp,static_assert.hpp,swap.hpp,throw_exception.hpp,type.hpp,utility.hpp,variant.hpp,version.hpp

1 例如http://www.boost.org/doc/libs/1_47_0/libs/spirit/doc/html/spirit/karma/performance_measurements/numeric_performance/double_performance.html

关于c++ - float <-> std::string 转换替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7548564/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com