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)
虽然您可能可以使用 实现您想要的功能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范围。