我有一个由三个连续的子阵列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。请注意,“范围”的大小仅仅是说明性的。
答案 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
不能多说性能,但它并没有为我快速编译。