В чем смысл использования ostringstream вместо обычной строки?

Я впервые изучаю сокеты C++, и в моем примере много используется ostringstream. Какова цель и преимущество использования строковых потоков здесь, а не просто строк? В этом примере мне кажется, что я мог бы так же легко использовать обычную строку. Разве использование этого ostringstream не является более громоздким?

std::string NetFunctions::GetHostDescription(cost sockaddr_in &sockAddr)
{
    std::ostringstream stream;
    stream << inet_ntoa(sockAddr.sin_addr) << ":" << ntohs(sockAddr.sin_port);
    return stream.str();
}

person user3685285    schedule 07.11.2016    source источник
comment
Возможный дубликат c++ std::ostringstream vs std::string::append   -  person Eli Sadoff    schedule 07.11.2016
comment
Напишите эквивалентный код с std::string. Сомневаюсь, что вы много сэкономите. Обычно преимущество stringstream заключается в том, что вы можете легко заменить его на cout или fstream позже.   -  person nwp    schedule 07.11.2016
comment
Вам потребуется больше ручных преобразований, если вы используете std::string. Перегрузки << очень удобны.   -  person molbdnilo    schedule 07.11.2016
comment
Мне кажется, что в этом примере я мог бы так же легко использовать обычную строку. Попробуйте, а затем вернитесь к нам и скажите, занимаете ли вы эту позицию по-прежнему.   -  person Lightness Races in Orbit    schedule 07.11.2016
comment
Вы смотрите на это на стороне клиента. Что, если это функция, которую вы не писали, и она требует std::ostream, но вы хотите видеть результаты в строке (а не, скажем, в консоли)? Вы не можете дать ему std::string, не так ли?   -  person PaulMcKenzie    schedule 07.11.2016


Ответы (1)


Потоки — это буферы. Они не равны массивам символов, таким как std::string, который в основном представляет собой объект, содержащий указатель на массив символов. Потоки уже имеют свои внутренние функции, манипуляторы, состояния и операторы. Строковый объект в сравнении будет иметь некоторые недостатки, например, с выводом чисел, отсутствием удобных функций, таких как endl, неудобной конкатенацией, esp. с функциональными эффектами (результаты, возвращаемые функциями) и т. д. Строковые объекты для этого просто громоздки.

Теперь std::ostringstream представляет собой удобный и легко настраиваемый буфер для форматирования и подготовки большого количества данных в текстовом виде (включая числа) для дальнейшего комбинированного вывода. Более того, по сравнению с простым объектом ostream cout, у вас может быть пара таких буферов и жонглировать ими как вам нужно.

person Mykola Tetiuk    schedule 29.03.2021