У меня есть строка, на каждой итерации нужно убирать первый элемент и добавлять в конец новый. Можно ли делать такое обновление быстрее, чем за длину строки? И более обобщенный случай: как выбрать у строки подстроку с определенного индекса до другого индекса (есть ли такая функция в std)?
Можно сделать данную операцию не за O(n), а за O(log n), используя декартово дерево по неявному ключу. Строить его нужно на символах данной строки. Построение - О(n*log(n)), зато удаление и вставка из произвольного места(в т.ч. удаление символа из начала и вставка в конец) за O(log(n).
вопрос вроде про "чистую" строку был. как непосредственно к строке это можно применить не копируя в/из нее элементы в другую структуру данных. если на то уж пошло в std::deque вставка и удаление в начале и в конце O(1).