Так istringstream
копирует содержание строки при инициализации, например,
string moo("one two three four");
istringstream iss(moo.c_str());
Я задавался вопросом, существует ли способ сделать std::istringstream
используйте данный c_str
как его буфер, не копируя вещи. Таким образом, это не должно будет копировать большие биты памяти прежде, чем передать std::istringstream&
к функциям, которые берут istream&
как аргумент.
То, что я пытался сделать, является преобразованием некоторые функции, которые только берут std::ifstream&
аргументы (они - главным образом синтаксические анализаторы) во взятие istream&
также. Я должен был бы сделать свое собственное istream
подкласс для этого?
Достаточно просто написать базовый класс std :: streambuf
, который читает из заданной области памяти. Затем вы можете построить istream
из этого и читать из него.
инициализация C ++ std :: istringstream из буфера в памяти?
Обратите внимание, что время жизни указанного буфера c_str ()
очень ограничено, и нет гарантии, что вызов c_str ()
хочет вызвать некоторое копирование, хотя я не знаю ни одной реализации, где это происходит.
Это зависит от того, что делает std :: string. Согласно 27.2.1 / 1 класс basic_istringstream
Поскольку класс должен использовать объект, он должен скопировать конструкцию строки в этот объект.
Таким образом, реальный вопрос заключается не в том, копирует ли строковый поток
содержимое, а в том, будет ли копирование при построении строки копировать содержимое или реализовывать какую-то схему копирования при записи.
устаревший istrstream
поддерживает эту функцию.
#include <string>
#include <strstream>
using namespace std;
int main(int argc, char* argv[])
{
string moo = "one two three four";
istrstream istr(const_cast<char*>(moo.c_str()),moo.size());
std::string line;
while(!istr.fail() && !istr.eof()){
getline(istr,line,' ');
cout << line << "_";
}
// prints: one_two_three_four_
}
Есть только копия, потому что переданный вами параметр, const char *
, требует преобразования в тип аргумента конструктора istringstream .
Просто передайте строку
без вызова c_str ()
.
istringstream iss(moo);
Хорошо, это не мешает копированию полностью, но устраняет ненужную копию. Чтобы полностью исключить копию, вам придется переписать std :: stringbuf
, что специально позволяет избежать работы непосредственно с строкой
, которую вы ей передаете.