Как реализовать на месте std :: string substr - PullRequest
1 голос
/ 22 февраля 2020

Я пытаюсь написать функцию, которая получит подстроку строки, но изменяет ее на месте, а не создает дубликаты.

Способ C -i sh:

memmove((void*)&str[0], (const void*)&str[start], sizeof(char)*count);
str.resize(count);

Так близко к C ++ 11, насколько я знаю, как кодировать:

auto write_it=str.begin();
for(auto read_it=str.begin()+start;read_it!=str.begin()+start+count;read_it++)
{
    *write_it=*read_it;
    write_it++;
}
str.resize(count);

Что из этого теоретически быстрее? У меня было предчувствие memmove(), но это все равно создает буфер под капотом, так что в конечном итоге это может навредить нам.

Являются ли какие-либо из них переносимыми? Я не уверен, что моя модификация строки гарантированно не сделает недействительными мои итераторы. Редактировать: Согласно Делает ли перемещение символов в строку недействительными итераторы? мой подход итератора безопасен. Но действительно ли это эффективно? Единственная причина, по которой меня волнует, - это то, что я пишу код, который будет вызываться другими пользователями, поэтому он должен быть по крайней мере достаточно быстрым.

Я невероятно удивлен, что нигде не смотрел об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...