У меня есть имя std::string
, которое я хочу заполнить данными через интерфейс std::ostream
и избежать копирования строки.
Один из способов сделать это, который требует копирования, заключается в следующем:
bool f(std::string& out)
{
std::ostringstream ostr;
fillWithData(ostr);
out = ostr.str(); // 2 copies here
return true;
}
Мне нужно передать результат через out
, и я не могу вернуть ostr.str()
.
Я хочу избежать копий в out = ostr.str();
, так как эта строка может быть очень большой.
Есть ли способ, возможно, с помощью rdbuf()
s, связать буфер std::ostream
напрямую с out
?
Чтобы уточнить, меня интересует автоматическое расширение std::string
и std::ostream
, чтобы вызывающему абоненту не нужно было знать размер перед вызовом.
ОБНОВЛЕНИЕ: я только что понял, что безобидная строка out = ostr.str();
, вероятно, повлечет за собой 2 копии:
- Первый по вызову
str()
- Другой с помощью оператора присваивания
std::string
.
f
приниматьstd::ostringstream &
в качестве аргумента? - person Didier Trosset   schedule 30.04.2014std::ostringstream
— это деталь реализации. - person Adi Shavit   schedule 30.04.2014ostringstream
не поддерживает создание строки с повторным использованием ее памяти, не с текущим стандартом. - person ytoledano   schedule 25.06.2019