gpt4 book ai didi

c++ - 使用 iostream 根据用户的区域设置格式化数字的高效方法?

转载 作者:行者123 更新时间:2023-11-30 02:50:33 32 4
gpt4 key购买 nike

在我们应用程序的一部分中,需要根据用户的区域设置格式化数字。

界面基本上是这样的:

std::string format_number(double number);

旧的实现是这样的:

std::string format_number(double number) {
using namespace std;
static const locale user_loc("");
ostringstream fmtstream;
fmtstream.imbue(user_loc);
fmtstream << std::fixed;
fmtstream << number;
return fmtstream.str();
}

我们现在注意到,使用我们的编译器 (MSVC 2005),我们可以通过直接使用 num_put 将此函数的速度提高大约 10-20%(单独测量):

std::string format_number(double number) {
using namespace std;
static const locale user_loc("");
ostringstream fmtstream;
fmtstream.imbue(user_loc);
fmtstream << std::fixed;
typedef char* CharBufOutIt;
typedef num_put<char, CharBufOutIt> np_t;
np_t const& npf = use_facet<np_t>(user_loc);
char buf[127];
const CharBufOutIt begin = &buf[0];
const CharBufOutIt end = npf.put(/*out=*/begin, /*format=*/fmtstream, /*fill=*/' ', number);
return std::string(begin, end);
}

这看起来仍然不是最理想的:

  • 我们需要构造一个流对象,以便为其注入(inject)语言环境并将其用于格式化标志。
  • 我们无法缓存流对象,因为 put 将在传递的格式流上调用 width(0)

是另一个加快速度的“技巧”,还是我们希望从 iostream 中得到的最多?

请注意,我们不能在此处使用 sprintf,因为我们需要确保使用了完整的语言环境,包括千位分隔符,并且 printf 不会输出千位分隔符。

最佳答案

您需要用于格式化的流和语言环境。如果您不需要这些,我会建议直接使用默认构造的 num_put facet。我在这里看到的唯一优化是使用 std::string 迭代器而不是原始指针:

typedef std::back_insert_iterator<std::string> iter_type;
typedef std::num_put<char, iter_type> facet_type;

const facet_type& num_put = std::use_facet<facet_type>(user_loc);
std::string buf;

num_put.put(std::back_inserter(buf), fmtstream, fmtstream.fill(), number);

作为对评论的回应,以下是您将如何使用默认构造的方面类型实现您的功能:

template<class Facet>
class erasable_facet : public Facet
{
public:
erasable_facet() : Facet(1)
{ }

~erasable_facet() { }
};

std::string format_number(double number)
{
typedef std::back_insert_iterator<std::string> iter_type;
typedef std::num_put<char, iter_type> facet_type;

erasable_facet<facet_type> num_put;
std::ios str(0);
std::string buf;

num_put.put(std::back_inserter(buf), str, str.fill(), number);
return buf;
}

关于c++ - 使用 iostream 根据用户的区域设置格式化数字的高效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20384848/

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