некопирование istringstream

Так istringstream копирует содержание строки при инициализации, например,

string moo("one two three four");
istringstream iss(moo.c_str());

Я задавался вопросом, существует ли способ сделать std::istringstream используйте данный c_str как его буфер, не копируя вещи. Таким образом, это не должно будет копировать большие биты памяти прежде, чем передать std::istringstream& к функциям, которые берут istream& как аргумент.

То, что я пытался сделать, является преобразованием некоторые функции, которые только берут std::ifstream& аргументы (они - главным образом синтаксические анализаторы) во взятие istream& также. Я должен был бы сделать свое собственное istream подкласс для этого?

11
задан Null 2 July 2015 в 22:11
поделиться

4 ответа

Достаточно просто написать базовый класс std :: streambuf , который читает из заданной области памяти. Затем вы можете построить istream из этого и читать из него.

инициализация C ++ std :: istringstream из буфера в памяти?

Обратите внимание, что время жизни указанного буфера c_str () очень ограничено, и нет гарантии, что вызов c_str () хочет вызвать некоторое копирование, хотя я не знаю ни одной реализации, где это происходит.

4
ответ дан 3 December 2019 в 07:10
поделиться

Это зависит от того, что делает std :: string. Согласно 27.2.1 / 1 класс basic_istringstream ... использует объект basic_stringbuf для управления связанным хранилищем. Поскольку класс должен использовать объект, он должен скопировать конструкцию строки в этот объект.

Таким образом, реальный вопрос заключается не в том, копирует ли строковый поток содержимое, а в том, будет ли копирование при построении строки копировать содержимое или реализовывать какую-то схему копирования при записи.

2
ответ дан 3 December 2019 в 07:10
поделиться

устаревший 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_
}
3
ответ дан 3 December 2019 в 07:10
поделиться

Есть только копия, потому что переданный вами параметр, const char * , требует преобразования в тип аргумента конструктора istringstream .

Просто передайте строку без вызова c_str () .

istringstream iss(moo);

Хорошо, это не мешает копированию полностью, но устраняет ненужную копию. Чтобы полностью исключить копию, вам придется переписать std :: stringbuf , что специально позволяет избежать работы непосредственно с строкой , которую вы ей передаете.

2
ответ дан 3 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: