Вы не можете на самом деле сформировать станд.:: строка, не копируя данные. stringstream, вероятно, снова использовал бы память от передачи до передачи (хотя я думаю, что стандарт тих на том, имеет ли это на самом деле к), но это все еще не избежало бы копирования.
общий подход А к этому виду проблемы должен записать код, который обрабатывает данные на шаге 3 к использованию начать/конечным итератор пара; тогда это может легко обработать любого станд.:: строка, вектор символов, пара необработанных указателей, и т.д. В отличие от передачи его контейнерный тип как станд.:: строка, это больше не знало бы или заботилось бы, как память была выделена, так как это будет все еще принадлежать вызывающей стороне. Перенос этой идеи ее логическому выводу повышение:: диапазон , который добавляет всех перегруженных конструкторов для тихого разрешения вызывающей стороне просто передать string/vector/list/any вид контейнера с .begin () и .end (), или отдельные итераторы.
записавший Ваш код обработки для работы над произвольным диапазоном итератора Вы могли тогда даже записать пользовательский итератор (не настолько трудно, как это звучит, в основном просто объект с некоторыми стандартными определениями типов и оператор ++ /* / = / ==/! = перегруженный для получения вперед только итератор), который заботится об усовершенствовании к следующему фрагменту каждый раз, когда это поразило конец того, это продолжает работать, перескакивая через пробел (я предполагаю, что это - то, что Вы подразумевали под обрезкой). То, что Вы никогда не должны были собирать целую строку непрерывно вообще. Было ли это победой, зависит от того, сколько фрагментов/как, больших из фрагментов, Вы имеете. Это по существу, какова веревка SGI, упомянутая Martin York: строка, где добавляют, формирует связанный список фрагментов вместо непрерывного буфера, который таким образом подходит для намного более длинных значений.
ОБНОВЛЕНИЕ (так как я все еще вижу случайный upvotes на этом ответе):
C++ 17 представляет другой выбор: станд.:: string_view, который заменил станд.:: строка во многих функциональных подписях, ссылка невладения на символьные данные. Это неявно конвертируемо от станд.:: строка, но может также быть явно создан из непрерывных данных, принадлежавших где-то в другом месте, избежав ненужного станд. копирования:: строка налагает.
Технически вам нужно только использовать self перед методами присваивания. Это необходимо, чтобы различать метод экземпляра с завершающим знаком = и присвоение локальной переменной.
Насморн прав.
ActiveRecord :: Base поместил все имена столбцов в переменную экземпляра @attributes
(хэш) и создал методы экземпляра средств доступа для этих имен столбцов.
Например:
card_status - это столбец в таблице external_printing_cards, он будет иметь методы доступа с именем card_status
и card_status =
Поскольку определение локальной переменной ruby является динамическим, Строка
def after_find
....
card_status = false if self.is_used_up?
....
end
будет означать, что мы определяем и назначаем локальную переменную card_status
, а не метод экземпляра card_status =
В статье, опубликованной Peer Allan, содержится более подробное объяснение по этому поводу.