是否有一种简单的方法可以互相交换数组的部分(块)?也就是说,我有一个数组:
array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 4;
array[4] = 5;
array[5] = 6;
array[6] = 7;
array[7] = 8;
和一个名为swapSections(startX, endX, startY, endY)
的函数,它几乎给出了这些值,将endX - startX
确定的值范围与StartY
到endY
的范围进行交换,因此从我的例子......
如果x range = 2
和startX = 0
以及y range = 3
和startY = 5
,它会将数组[0]和数组[1]放到数组[5]和数组[6]中]是,然后在数组[6]之后放置数组[7],将其他所有内容向下推。我不知道如何解决这个问题,而且我正在将内存复制到临时数组中,但我认为有更好的方法可以做到这一点。 (顺便说一下,我的例子的最终结果是):
array[0] = 6;
array[1] = 7;
array[2] = 8;
array[3] = 3;
array[4] = 4;
array[5] = 5;
array[6] = 1;
array[7] = 2;
答案 0 :(得分:2)
在可读性和工作量方面交换数组部分的最简单方法是使用标准C ++函数swap_ranges()
#include <iostream>
#include <algorithm>
int main()
{
int a[8] = {1,2,3,4,5,6,7,8};
std::cout << "Beforeswap: ";
for(int i=0; i<8; ++i)
std::cout << a[i] << ' ';
std::cout << '\n';
std::swap_ranges(a+0, a+2, a+5);
std::cout << "After swap: ";
for(int i=0; i<8; ++i)
std::cout << a[i] << ' ';
std::cout << '\n';
}
...但它只会交换相等长度的子范围,而不是测试用例中的不等长度。您的案例实际上是swap_ranges()
和rotate()
的组合。
答案 1 :(得分:1)
您可能希望查看valarray及其片段。
答案 2 :(得分:0)
您可以在示例中采用的一种方法是交换最小范围,然后“冒泡”最后一部分。所以:
array[0] = 1; --> 6
array[1] = 2; --> 7
array[2] = 3;
array[3] = 4;
array[4] = 5;
array[5] = 6; --> 1
array[6] = 7; --> 2
array[7] = 8;
然后你通过交换数组[7],数组[6],数组[6]和数组[5]等来冒泡8,直到你把8放在正确的位置。希望这能让你开始。
答案 3 :(得分:0)
假设你有(或可以创建)一个函数来反转一系列元素,比如reverse(array, start, end)
。然后,您可以分四步执行此任务:
// (1) reverse the first range
array[0] = 2;
array[1] = 1;
// (2) reverse the elements between the ranges
array[2] = 5;
array[3] = 4;
array[4] = 3;
// (3) reverse the second range
array[5] = 8;
array[6] = 7;
array[7] = 6;
// (4) finally, reverse the entire array
array[0] = 6;
array[1] = 7;
array[2] = 8;
array[3] = 3;
array[4] = 4;
array[5] = 5;
array[6] = 1;
array[7] = 2;
剧透:(先做好你的作业再看看)
如果您被允许使用标准库,
std::reverse
中的<algorithm>
功能会使这一点变得微不足道。