中途反转/交换

Reverse/Swap halfway

本文关键字:交换      更新时间:2023-10-16

反转整个vector存在std::reverse.但是我想将向量"分成两部分(正好在中间(并反转两者,将它们重新组合在一起并再次反转整个vector。例如,我们有:

0 1 2 3 4 5 6 7

而不是将其分成两部分并颠倒两部分:

0 1 2 3->3 2 1 04 5 6 7->7 6 5 4,将反转的部分放在一起3 2 1 0 7 6 5 4并再次反转:4 5 6 7 0 1 2 3

我尝试了reverse_copy但没有成功。这是我的代码片段:

std::vector<int>::iterator mid = nr.begin() + nr.size() / 2;
std::vector<int>::iterator midLast = nr.size() / 2 + nr.end();
vector<int> temp1, temp2;
std::reverse_copy(nr.begin(),mid, std::begin(temp1));
std::reverse_copy(midLast, nr.end(), std::begin(temp2));
std::reverse(temp1.begin(), temp2.end());

我该如何实施我的方法?谢谢!

std::reverse(nr.begin(), nr.begin() + nr.size() / 2 );
std::reverse(nr.begin() + nr.size() / 2 + ((nr.size() % 2) != 0 ? 1 : 0), nr.end());
std::reverse(nr.begin(), nr.end());
for (auto& it : nr)
{
std::cout << it << " ";
}

0, 1, 2, 3, 4, 5, 6, 7, 8输出

5 6 7 8 4 0 1 2 3

0, 1, 2, 3, 4, 5, 6, 7输出

4 5 6 7 0 1 2 3

可以使用标准算法std::swap_ranges来完成该任务。

例如

#include <iostream>
#include <iterator>
#include <algorithm>
int main()
{
std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7 };
std::swap_ranges(v.begin(), std::next(v.begin(), v.size() / 2),
std::prev(v.end(), v.size() / 2));
for (int x : v) std::cout << x << ' ';
std::cout << std::endl;
return 0;
}

程序输出为

4 5 6 7 0 1 2 3

否则,您可以只使用std::reverse而不是算法std::reverse_copy

例如

#include <iostream>
#include <iterator>
#include <algorithm>
int main()
{
std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7 };
for (int x : v) std::cout << x << ' ';
std::cout << std::endl;
std::reverse(v.begin(), std::next(v.begin(), v.size() / 2));
std::reverse(std::prev(v.end(), v.size() / 2), v.end());
for (int x : v) std::cout << x << ' ';
std::cout << std::endl;
std::reverse(v.begin(), v.end());
for (int x : v) std::cout << x << ' ';
std::cout << std::endl;
return 0;
}

程序输出为

0 1 2 3 4 5 6 7
3 2 1 0 7 6 5 4
4 5 6 7 0 1 2 3

这个版本将处理奇数个元素(中间的元素不动(

auto size = nr.size();
auto begin = nr.begin();
auto end = nr.end();
std::reverse(begin, begin + size/2);
std::reverse(begin + size/2 + (size%2), end);
std::reverse(begin, end);

正如BoBTFish所提到的,这就是std::rotate所做的。

#include <vector>
#include <iostream>
#include <algorithm>
void printVector(const std::vector<int>& aVector)
{
for (auto& val : aVector)
{
std::cout << val << " ";
}
std::cout << std::endl;
} 
int main()
{
std::vector<int> intVect{0, 1,2,3,4,5,6,7};
printVector(intVect);
std::rotate(intVect.begin(), intVect.begin() + intVect.size() / 2, intVect.end());
printVector(intVect);
return 0;
}

这将输出所需的结果:

0 1 2 3 4 5 6 7

4 5 6 7 0 1 2 3