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

Efficient way to reverse three consecutive subranges [A,B,C] -> [C,B,A]

我有一个数组 [A,B,C],由三个连续的子数组 A、B 和 C 组成。我想将较大的数组反转为 [C,B,A]。我目前的尝试涉及对 std::rotate 的调用,如下所示。我想知道是否有更多 straightforward/efficient 方法来实现这一点,最好使用 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] 我想 "reverse" 把它变成 [7,8,9|4,5,6|1,2,3]

Sample implementation。请注意 "ranges" 的大小仅供参考。

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

[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 缓存友好。

这是一个包含 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 

关于性能不能说太多,但对我来说编译速度不快。