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



我有一个数组[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]

示例实现。

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

[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 

不能说太多关于性能,但它对我来说编译得不是很快。

相关内容

  • 没有找到相关文章

最新更新