Сдвиг вектора в C ++ 20 - PullRequest
       84

Сдвиг вектора в C ++ 20

7 голосов
/ 03 августа 2020

Я бы хотел использовать эту новую функцию из C ++ 20 для смещения вектора вправо std::shift_right.

Я не уверен в том, как получить последний элемент в начало вектора после сдвига?

Как в примере выше ... Где я сохраняю последний элемент во временной переменной, а затем после сдвига я устанавливаю первый элемент как временную переменную.

#include <iostream>
#include <vector>
#include <algorithm>



int main()
{
    std::vector<int> seq = { 5, 4, 3, 2, 1 };

    std::vector<int>::iterator it;
    std::vector<int>::iterator temp;
    temp = seq.end() - 1;


    std::shift_right(seq.begin(), seq.end(), 1);
    std::replace(seq.begin(), seq.end(), seq.at(0), *temp);

    for (it = seq.begin(); it != seq.end(); it = std::next(it))
        std::cout << *it << " ";

    return 0;
}

1 Ответ

7 голосов
/ 03 августа 2020

Хотя вы, вероятно, можете достичь того, чего хотите, с помощью std::shift_right, соответствующий алгоритм для выполнения описанных вами действий - std::rotate, который вы также можете использовать без C ++ 20:

std::rotate(seq.begin(), seq.end() - 1, seq.end());    

Вот демонстрация .

Причина, по которой версия shift_right не работает, заключается в том, что у вас есть итератор для последнего элемента. Когда вы заканчиваете sh сдвиг, исходный последний элемент перезаписывается, и теперь итератор указывает на сдвинутый элемент. Итак, что вы можете сделать, это сделать копию последнего элемента , а затем поместить его в начало:

int temp = seq.back();
std::shift_right(seq.begin(), seq.end(), 1);
seq[0] = temp;

Вот демонстрация . Но учтите, что это взлом; используйте shift_right, если вас не волнуют те элементы, которые вы перезаписываете. Если вас волнуют элементы, то rotate диапазон.

...