2013-04-20 26 views
1

我发现自己不得不std :: cout各种双变量。 我做了一个简单的函数来双转换为一个std ::字符串,然后我就可以用的std ::法院等将double转换为字符串函数 - 内存问题?

// Convert a double to a string. 
std::string dtos(double x) { 
    std::stringstream s; 
    s << x; 
    return s.str(); 
} 

的功能似乎工作确定,但我的问题是使用:这种方法是否有任何(坏)内存影响,即。我是在分配一些不必要的记忆,还是留下任何“晃来晃去”的东西?

谢谢你们 皮特

+0

您不必将double转换为std :: cout或其他流对象的字符串 – 2013-04-20 06:44:16

+0

@named:谢谢,但是如果我返回s,该方法将无法编译。你的意思是把函数签名也改为std :: stringstream?要么? – Pete855217 2013-04-20 06:52:43

+0

@ miguel.martin - 对不起,我的意思是字符串操作,例如。 s +“\ n”+ x等 – Pete855217 2013-04-20 06:54:40

回答

2

不,你的代码是OK,阅读代码中的注释:

std::string dtos(double x) { 
    std::stringstream s; // Allocates memory on stack 
    s << x; 
    return s.str();  // returns a s.str() as a string by value 
          // Frees allocated memory of s 
} 

另外,你可以直接传递到doublecout

1

您不必将双打换成字符串即可使用std::cout

cout << x; 

的工作只是罚款,

cout << dtos(x); 

如果你想改变双串出于其他原因,那么你可以使用,你可以在C++ 11使用std::to_string

除此之外,你的代码还不错。

+0

不!他不能返回's'而不是's.str()',因为's'具有不同的类型。 – deepmax 2013-04-20 06:52:52

+0

@ahhh你是对的我不知道为什么我认为它是字符串。 – stardust 2013-04-20 06:54:14

+0

@names,对不起,我的意思是操纵字符串,例如。 x + s +“\ n”等。std :: cout显然适用于双打,它正在构建我遇到问题的新字符串。带上C++ 11!这个版本似乎解决了很多需要额外代码行的C++问题。 – Pete855217 2013-04-20 06:56:01

2

惊讶没有人提到这一点,但你可以使用模板为任何类型的算法生成该算法。

像这样:

template<typename T> 
std::string to_string(const T& obj) 
{ 
    std::ostringstream s; 
    s << obj; 
    return s.str(); 
} 

这样,你可以很容易地转换为字符串,像这样:

int x = 5; 
to_string(x); // will convert the integer to a string 

to_string(32); // constants works 
to_string<double>(302); // you can explicitly type the type you wish to convert 

用法示例是在这个link

另外,正如其他人所说的,没有任何记忆会在任何地方发生。另外,我想提一下,由于您只写信给字符串流,因此您可能应该使用std::ostringstream(1)当人们阅读您的代码时进一步说明;(2)没有使用>>代替< <