反转整个vector
存在std::reverse
.但是我想将向量"分成两部分(正好在中间(并反转两者,将它们重新组合在一起并再次反转整个vector
。例如,我们有:
0 1 2 3 4 5 6 7
而不是将其分成两部分并颠倒两部分:
0 1 2 3
->3 2 1 0
和4 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