LINUX.ORG.RU

[C++][std::string] как бы заполнить строку без промежуточной буферизации?

 


0

2

Есть ф-я вида

void load(char* buf);
закатывающая в buf какой то текст, длина текста заранее известна. Как бы мне этот текст загнать в std::string не создавая промежуточного буфера? Не то, что это принципиально - но просто оскорбляется моего чувство прекрасного;-) Есть метод
const char* std::string::data()
но вроде как и сигнатура, и документация намекают что он не про то, а больше ничего и не нашел похожего... ;-( Хотя
std::string S; 
S.resize(len); 
load( (char*)S.data() );
работает. Но вопрос к знатокам изящных искусств - наскока оно Ъ?;-)

PS Под промежуточной буферизацией понимается

char* buf = new char[len+1]; 
load(buf); 
buf[len] = 0;
std::string s(buf);
delete [] buf;

★★★★★

Последнее исправление: AIv (всего исправлений: 2)

string ( const char * s );
Content is initialized to a copy of the string formed by the null-terminated character sequence (C string) pointed by s. The length of the character sequence is determined by the first occurrence of a null character (as determined by traits.length(s)). This version can be used to initialize a string object using a string literal constant.
anonymous
()
Ответ на: комментарий от AIv

А чем плох вариант с data()?

The returned array points to an internal location which should not be modified directly in the program. Its contents are guaranteed to remain unchanged only until the next call to a non-constant member function of the string object.

staseg ★★★★★
()
Ответ на: комментарий от staseg

Если некритична производительность, делай, как писал анонимус. Или определись между char* и std::string.

staseg ★★★★★
()
Ответ на: комментарий от staseg

Это я прочел. А я если я гарантированно не собираюсь никаких «call to a non-constant member function of the string object» от data() до конца load?

AIv ★★★★★
() автор топика
Ответ на: комментарий от staseg

определись между char* и std::string.

Сложный выбор.... не люблю я std. Но руками рулить памятью для строк в 3-ем тысячелетии ИМНО содомия, а писать свои строки - я уже вышел из того возраста;-)

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

Это я прочел. А я если я гарантированно не собираюсь никаких «call to a non-constant member function of the string object» от data() до конца load?

Насколько я понимаю, второе предлоежение - не объяснение первого. Просто запрещается модифицировать внутренние данные, но в реальности, если не забыть сделать правильный resize, скорее всего все будет нормально.

staseg ★★★★★
()
Ответ на: комментарий от staseg

Я тоже так думаю... вообще забавно, то ли аффтары такие перестраховщики, то ли это плата за типа стремление к чистоте ООП-стиля.

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

Сложный выбор.... не люблю я std. Но руками рулить памятью для строк в 3-ем тысячелетии ИМНО содомия, а писать свои строки - я уже вышел из того возраста;-)

Можно сделать std::string load() или void load(std::string &). Если этот API забит как void load(char*), я бы предпочел в зависимости от ситуации немного поработать в вызывающем коде с char*-строкой или прочитал в промежуточный буфер и завернул в строку. Не люблю «хакерский» код :)

staseg ★★★★★
()
Ответ на: комментарий от AIv

Я тоже так думаю... вообще забавно, то ли аффтары такие перестраховщики, то ли это плата за типа стремление к чистоте ООП-стиля.

Скорее огораживание абстракции «строка» от ее реализации.

staseg ★★★★★
()
Ответ на: комментарий от staseg

Гы, а оказывается таки data и c_str возвращают один и тот же пойнтер! И что мешало сделать?

char* std::string::data()
видимо религия....

load на самом деле fread (или gzread), так что тут глухо. Целевая строка - поле класса, и оно превратилось в std::string из char* когда меня задолбало следить за мусором;-)

Ну значицца хакнем с resize-data, не люблю лишних new...

Спасибо!

AIv ★★★★★
() автор топика
Ответ на: комментарий от staseg

Аааа! Они боялись, что в 2012 лисп таки победит, и все строки будут храниться в виде посимвольных списков. Но data то они все равно ж зачем то оставили, какая уж тут абстракция...

AIv ★★★★★
() автор топика
Ответ на: комментарий от AIv

Посимвольные списки - это к хаскелю. В лиспе строка - это вектор, массив то бишь ;)

dave ★★★★★
()
Ответ на: комментарий от AIv

Я тоже так думаю... вообще забавно, то ли аффтары такие перестраховщики, то ли это плата за типа стремление к чистоте ООП-стиля.

Думаю, что это из-за COW.

Manhunt ★★★★★
()
Ответ на: комментарий от AIv

ТОчно! В обычных плюсах &(*S.begin())

Если верить ссылке выше, то это будет гарантированно верно только в C++0x.

user_2190
()
Ответ на: комментарий от AIv

Гы, а оказывается таки data и c_str возвращают один и тот же пойнтер! И что мешало сделать?

Это называется «инкапсуляция», двоечник.

anonymous
()
Ответ на: комментарий от anonymous

Это называется «инкапсуляция». двоечник.

С чего Вы вообще взяли, что меня интересует Ваш средний балл?

AIv ★★★★★
() автор топика
Ответ на: комментарий от anonymous

вот приходят такие «умные» на собеседование, нарассказывают много умных слов, а как до дела доходит, так опаньки.

афтар, байты все одного сорта. ну или почти одного, ибо кэш порезан на линейки. бери data, и не мучайся.

ckotinko ☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.