инициализация станд.:: строка от символа* без копии

Я думаю, что это самый простой способ сделать это, используя JSON stringify, и это может быть лучшим решением в некоторых ситуациях:

JSON.stringify(a1) === JSON.stringify(a2);

Это преобразует объекты a1 и a2 в чтобы их можно было сравнить. Порядок очень важен в большинстве случаев, поскольку он может сортировать объект с помощью алгоритма сортировки, показанного в одном из приведенных выше ответов.

Пожалуйста, обратите внимание, что вы больше не сравниваете объект, а строковое представление объект. Это может быть не совсем то, что вы хотите.

43
задан Akusete 12 December 2008 в 12:52
поделиться

6 ответов

Вообще возможно использовать строку C++ на шаге 1? Если Вы используете string::reserve(size_t), можно выделить достаточно большой буфер для предотвращения нескольких выделений "кучи" при добавлении меньших строк, и затем можно просто использовать ту же самую строку C++ всюду по всем остающимся шагам.

См. эта ссылка для получения дополнительной информации об эти reserve функция.

18
ответ дан e.James 23 September 2019 в 13:03
поделиться

Это - ответ латерального мышления, не непосредственно обращаясь к вопросу, но "думая" об этом. Могло бы быть полезным, не мог бы...

обработка Только для чтения станд.:: строка действительно не требует очень сложного подмножества станд.:: функции строки. Есть ли возможность, что Вы могли сделать поиск/замену на коде, который выполняет всю обработку на станд.:: строки, таким образом, это берет некоторый другой тип вместо этого? Запустите с пустого класса:

класс lightweight_string {};

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

4
ответ дан Daniel Earwicker 23 September 2019 в 13:03
поделиться

Для помощи с действительно большими строками, SGI имеет класс, Вовлекают в его STL.
Нестандартный, но может быть полезным.

http://www.sgi.com/tech/stl/Rope.html

, По-видимому, веревка находится в следующей версии стандарта:-)
Примечание шутка разработчика. Веревка является большой строкой. (Ха Ха):-)

7
ответ дан Martin York 23 September 2019 в 13:03
поделиться

Каждое повторение, достаточно независимое, что можно использовать тот же станд.:: строка для каждого повторения? Можно было бы надеяться что Ваш станд.:: строковая реализация достаточно умна, чтобы снова использовать память при присвоении символа константы * ему, когда это ранее использовалось для чего-то еще.

Присвоение символа * в станд.:: строка должна всегда, по крайней мере, копировать данные. Управление памятью является одной из главных причин использовать станд.:: строка, таким образом, Вы не будете способным для переопределения его.

1
ответ дан David Norman 23 September 2019 в 13:03
поделиться

В этом случае мог бы это быть лучше обработать символ* непосредственно, вместо того, чтобы присвоить его станд.:: строка.

0
ответ дан Alan 23 September 2019 в 13:03
поделиться

Вы не можете на самом деле сформировать станд.:: строка, не копируя данные. stringstream, вероятно, снова использовал бы память от передачи до передачи (хотя я думаю, что стандарт тих на том, имеет ли это на самом деле к), но это все еще не избежало бы копирования.

общий подход А к этому виду проблемы должен записать код, который обрабатывает данные на шаге 3 к использованию начать/конечным итератор пара; тогда это может легко обработать любого станд.:: строка, вектор символов, пара необработанных указателей, и т.д. В отличие от передачи его контейнерный тип как станд.:: строка, это больше не знало бы или заботилось бы, как память была выделена, так как это будет все еще принадлежать вызывающей стороне. Перенос этой идеи ее логическому выводу повышение:: диапазон , который добавляет всех перегруженных конструкторов для тихого разрешения вызывающей стороне просто передать string/vector/list/any вид контейнера с .begin () и .end (), или отдельные итераторы.

записавший Ваш код обработки для работы над произвольным диапазоном итератора Вы могли тогда даже записать пользовательский итератор (не настолько трудно, как это звучит, в основном просто объект с некоторыми стандартными определениями типов и оператор ++ /* / = / ==/! = перегруженный для получения вперед только итератор), который заботится об усовершенствовании к следующему фрагменту каждый раз, когда это поразило конец того, это продолжает работать, перескакивая через пробел (я предполагаю, что это - то, что Вы подразумевали под обрезкой). То, что Вы никогда не должны были собирать целую строку непрерывно вообще. Было ли это победой, зависит от того, сколько фрагментов/как, больших из фрагментов, Вы имеете. Это по существу, какова веревка SGI, упомянутая Martin York: строка, где добавляют, формирует связанный список фрагментов вместо непрерывного буфера, который таким образом подходит для намного более длинных значений.

<час>

ОБНОВЛЕНИЕ (так как я все еще вижу случайный upvotes на этом ответе):

C++ 17 представляет другой выбор: станд.:: string_view, который заменил станд.:: строка во многих функциональных подписях, ссылка невладения на символьные данные. Это неявно конвертируемо от станд.:: строка, но может также быть явно создан из непрерывных данных, принадлежавших где-то в другом месте, избежав ненужного станд. копирования:: строка налагает.

22
ответ дан puetzk 23 September 2019 в 13:03
поделиться
Другие вопросы по тегам:

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