STL Rope - когда и где использовать
Мне было интересно, при каких обстоятельствах вы будете использовать веревку поверх другого контейнера STL?
5 ответов
Канаты представляют собой масштабируемую реализацию строки: они предназначены для эффективной работы, которая включает в себя строку в целом. Такие операции, как присваивание, объединение и подстрока, занимают время, практически не зависящее от длины строки. В отличие от строк C, веревки являются приемлемым представлением для очень длинных строк, таких как буферы редактирования или почтовые сообщения.
Преимущества:
Намного более быстрые операции конкатенации и подстроки с использованием длинных строк. Вставка символа в середине 10-мегабайтной веревки должна занимать порядка 10 микросекунд, даже если копия оригинала сохраняется, например, как часть истории редактирования. Напротив, для обычного представления "плоской" строки это займет порядка секунды. Время, необходимое для объединения, можно рассматривать как постоянное для большинства приложений. Совершенно разумно использовать веревку в качестве представления файла внутри текстового редактора.
Потенциально намного лучшая космическая производительность. Незначительные модификации веревки могут поделиться памятью с оригиналом. Веревки распределяются небольшими порциями, что значительно уменьшает проблемы фрагментации памяти, создаваемые большими блоками.
Назначение - это просто (возможно подсчет ссылок) присвоение указателя. В отличие от реализаций копирования при записи с подсчетом ссылок, это остается в значительной степени верным, даже если одна из копий впоследствии немного изменяется. Это очень недорого, чтобы проверить старые версии строки, например, в истории редактирования.
Можно просматривать функцию создания персонажей как веревку. Таким образом, кусок веревки может представлять собой файл размером 100 МБ, который читается только при проверке этого раздела строки. Конкатенация строки до конца такого файла не требует чтения файла. (В настоящее время реализация этого средства не завершена.)
https://wayback.archive.org/web/20130102093702/https://www.sgi.com/tech/stl/Rope.html
Это нестандартная альтернатива string
это обрабатывает большие размеры данных. Смотрите здесь, как это работает.
Единственная плохая вещь с веревками - нитки и неправильное использование.
В Linux (и, вероятно, в большинстве других операционных систем) говорится, что код безопасности потоков делает веревки намного медленнее. Поэтому я просто копирую этот код (устанавливаю def компилятора для отключения потоков), потому что я использую один поток во встроенной платформе.
В противном случае веревки намного быстрее строк, имеют меньшую вероятность выхода из памяти на больших буферах и намного быстрее для редактирования больших буферов; Например, удаление плохого персонажа в середине Библии.
Это связано с тем, как веревка интерпретируется как данные. Как множество маленьких маленьких "строк", соединенных вместе через связанный список для получения окончательной строки.
Я бы не стал использовать его вообще, но это потому, что я немного "уродливый", и склонен использовать только стандартные контейнеры. Веревка является частью реализации SGI STL и не является частью стандарта C++.
Здесь большое внимание уделяется строкам, состоящим из символов, но веревка - это просто одномерная последовательность с быстрыми вставками и удалениями (в любом месте последовательности).
Кажется немного удивительным, что такая базовая возможность редко требуется для чего-либо (кроме строк). Где бы я использовал целую веревку? Я не знаю, потому что для манипулирования им нужны индексы откуда-то.
Лучшим измышленным примером в реальном мире будет создание пользовательского интерфейса, позволяющего пользователю просматривать набор данных, состоящий из тысяч изображений, и пользователь должен иметь возможность удалить некоторые из них и изменить порядок остальных.