我有一个数组[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
不能说太多关于性能,但它对我来说编译得不是很快。