Преобразование двойной функции в строку — проблемы с памятью?

Я чувствую, что мне нужно std :: cout различных двойных переменных.
Я сделал простую функцию для преобразования double в std :: string, которую затем могу использовать с std :: cout и т. Д.

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

Кажется, что функция работает нормально, но мой вопрос: имеет ли этот подход (плохие) последствия для памяти, т.е. Я выделяю ненужную память или оставляю что-то «висящее»?

Спасибо, парни
Пит

1

Решение

Нет, ваш код в порядке, прочитайте комментарии к коду:

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
}

Кроме того, вы можете передать double в cout непосредственно.

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

Пример использования на этом ссылка на сайт.

Кроме того, как утверждают другие люди, память никуда не денется. Кроме того, я хотел бы отметить, что, поскольку вы пишете только в поток строк, возможно, вам следует использовать станд :: ostringstream для (1) дальнейшего разъяснения, когда люди читают ваш код и (2) без ошибок при использовании >> вместо <<

2

Вам не нужно менять двойники на строки, чтобы использовать std::cout,

cout << x;

будет работать просто отлично, как

cout << dtos(x);

И если вы хотите изменить double на строку по другим причинам, вы можете использовать, вы можете использовать станд :: to_string в C ++ 11.

Кроме этого ваш код просто отлично.

1
По вопросам рекламы [email protected]