1

C++使ったプログラムがありSDLます。レンダリング中に、いくつかのグラフィックス コンポーネントを描画する必要があります。ときどきdouble、小数点以下 1 桁に丸められた変数を に変換する必要がありますstd::string

このために、私は現在ostringstreamオブジェクトを使用しており、正常に動作します。

std::ostringstream ss;
ss << std::fixed << std::setprecision(1) << x;

ただし、変数を変換するこの方法がパフォーマンスに関して良い考えであるかどうかは疑問です。

doubleで変数を丸めようとしましたstd::to_string(std::round(x * 10) / 10))が、うまくいきませんでした2.500000000

  • 別の解決策はありますか?
  • ostringstream多額の費用がかかりますか?
4

1 に答える 1

3

パラメータとstd::to_string直接同等であるため、 で精度を指定することはできません( を使用している場合)。printf%fdouble

毎回ストリームを割り当てないことに懸念がある場合は、次のことができます。

#include <iostream>
#include <sstream>
#include <iomanip>

std::string convertToString(const double & x, const int & precision = 1)
{
    static std::ostringstream ss;
    ss.str(""); // don't forget to empty the stream
    ss << std::fixed << std::setprecision(precision) << x;

    return ss.str();
}


int main() {
    double x = 2.50000;

    std::cout << convertToString(x, 5) << std::endl;
    std::cout << convertToString(x, 1) << std::endl;
    std::cout << convertToString(x, 3) << std::endl;

    return 0;
}

出力します(Coliruを参照):

2.50000

2.5

2.500

私はパフォーマンスをチェックしませんでした...しかし、これをクラスにカプセル化することでさらにうまくいくと思います(呼び出しstd::fixedstd::precision1回だけのように)。

sprintfそれ以外の場合は、自分に合ったパラメーターで引き続き使用できます。


もう少し進んで、静的インスタンスまたは別のクラスのメンバーとして使用できるカプセル化クラスを使用します...必要に応じて(Coliruで表示)。

#include <iostream>
#include <sstream>
#include <iomanip>

class DoubleToString
{
public:
    DoubleToString(const unsigned int & precision = 1)
    {
        _ss << std::fixed;
        _ss << std::setprecision(precision);
    }

    std::string operator() (const double & x)
    {
        _ss.str("");
        _ss << x;
        return _ss.str();
    }

private:
    std::ostringstream _ss;

};


int main() {
    double x = 2.50000;

    DoubleToString converter;

    std::cout << converter(x) << std::endl;

    return 0;
}

使用しない別のソリューションostringstreamColiruで表示):

#include <iostream>
#include <string>
#include <memory>

std::string my_to_string(const double & value) {
  const int length = std::snprintf(nullptr, 0, "%.1f", value);

  std::unique_ptr<char[]> buf(new char[length + 1]);
  std::snprintf(buf.get(), length + 1, "%.1f", value);

  return std::string(buf.get());
}

int main(int argc, char * argv[])
{

    std::cout << my_to_string(argc) << std::endl;
    std::cout << my_to_string(2.5156) << std::endl;

}
于 2016-01-12T14:28:37.007 に答える