在 C++20 中移动向量

Dan*_*iel 7 c++ stl vector c++20

我想使用 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;
}
Run Code Online (Sandbox Code Playgroud)

cig*_*ien 7

虽然您可能可以使用 实现您想要的功能std::shift_right,但执行您所描述的操作的适当算法是std::rotate,您也可以在没有 c++20 的情况下使用它:

std::rotate(seq.begin(), seq.end() - 1, seq.end());    
Run Code Online (Sandbox Code Playgroud)

这是一个演示

shift_right版本不起作用的原因是您有一个指向最后一个元素的迭代器。当您完成移位时,原始的最后一个元素将被覆盖,并且迭代器现在指向移位的元素。所以你可以做的是复制最后一个元素,然后把它放在开头:

int temp = seq.back();
std::shift_right(seq.begin(), seq.end(), 1);
seq[0] = temp;
Run Code Online (Sandbox Code Playgroud)

这是一个演示。但请注意,这是一个 hack;使用shift_right,如果你不关心那些将要覆盖的元素。如果你关心元素,那么rotate范围。