有效的方法来反转三个连续的子范围[A,B,C] - > [C,B,A]

时间:2016-10-18 17:52:29

标签: c++ stl stl-algorithm

我有一个由三个连续的子阵列A,B和C组成的数组[A,B,C]。我想将较大的数组反转为[C,B,A]。我目前的尝试涉及到std::rotate的呼叫,如下所示。我想知道是否有更简单/有效的方法来实现这一点,最好使用std算法。

Step 1: "swap" sub-array B,C
[A,B,C] -> [A|B,C] -> [A,C,B]

Step 2: "swap" sub-array A,C
[A,C,B] -> [A,C|B] -> [C,A,B]

Step 3: "swap" sub-array A,B
[C,A,B] -> [C|A,B] -> [C,B,A]

修改

例如,给定数组[1,2,3|4,5,6|7,8,9]我想将其“反转”为[7,8,9|4,5,6|1,2,3]

Sample implementation。请注意,“范围”的大小仅仅是说明性的。

2 个答案:

答案 0 :(得分:5)

反转整个数组,然后反转每个子数组。

[1,2,3|4,5,6|7,8,9]
[9,8,7|6,5,4|3,2,1]
[7,8,9|4,5,6|1,2,3]

这将需要两次线性传递,并且非常适合CPU缓存。

答案 1 :(得分:0)

这是Ranges V3的一个版本:

array<int, 9> arr = {{1,2,3,4,5,6,7,8,9}};

auto v = view::chunk(arr, 3) | view::reverse | view::join;

array<int, 9> reversed;
ranges::copy(v, reversed.begin());

for(int n : arr) cout << n << ' '; cout << '\n';
for(int n : reversed) cout << n << ' '; cout << '\n';

打印:

1 2 3 4 5 6 7 8 9 
7 8 9 4 5 6 1 2 3 

不能多说性能,但它并没有为我快速编译。