Какова причина, по которой STD :: rotate () реализован таким образом?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Какова причина, по которой STD :: rotate () реализован таким образом?

Сообщение Anonymous »

Согласно cppreference возвращаемое значение std :: rotate () < /code> is < /p>

Итератор на элемент, первоначально ссылаясь *сначала *, то есть std :: distance (middle, last)
th stear iterator first. Реализация: < /p>

Код: Выделить всё

template
constexpr // since C++20
ForwardIt rotate(ForwardIt first, ForwardIt middle, ForwardIt last)
{
if (first == middle)
return last;

if (middle == last)
return first;

ForwardIt write = first;
ForwardIt next_read = first; // read position for when “read” hits “last”

for (ForwardIt read = middle; read != last; ++write, ++read)
{
if (write == next_read)
next_read = read; // track where “first” went
std::iter_swap(write, read);
}

// rotate the remaining sequence into place
rotate(write, next_read, last);
return write;
}
< /code>
if (First == Middle) || (Средний == Последний) 
, нет ничего полезного с контейнером, поэтому функция возвращается немедленно. Это имеет смысл. Но почему в этом случае возвращаются разные итераторы? Зачем возвращать последний , если First == Middle и возвращайте первый , если средний == последний ? Почему бы не вернуть первый в любом случае? Просто любопытно. Если он реализован таким образом, для этого должна быть причина. Какой смысл?

Подробнее здесь: https://stackoverflow.com/questions/790 ... d-this-way
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»