中途反转/交换
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 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
相关文章:
- C++嵌套if语句,基本货币交换
- shell排序中的交换和比较
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- 通过交换元素使数组相同
- 如何使 std::sort 在 std::swap 和我的命名空间的模板化交换之间没有名称冲突?
- 交换运算符 + 重载会导致无限递归
- 为什么 std::reduce 需要交换性?
- 复制和交换习惯用法与移动操作之间的交互
- C++ - 没有自定义交换功能的移动分配运算符?
- 如何在数组中交换最小和最大的位置?
- 尽管一切看起来都很好,但值不会交换
- C++交换来自同一类成员的参数值,处理多个类
- 插入排序的最小交换
- C++在 2 个向量向量之间交换向量
- 转置矩阵:交换元素不会更改值
- 不正确的比较和交换计数器输出用于快速排序功能
- 交换函数不是在 C++ 中交换 2D 数组的元素
- std::vector move 而不是交换到空 vector 并释放存储
- 否,除了交换和移动具有互斥锁的类
- 如何交换数组中的元素?