如何从中间向外输出C++ vector元素?求更优雅实现方案
如何优雅地从中间向外交替输出vector元素?
给定如下vector:
vector<int> v = {1,2,3,4,5,6};
需要将其拆分为两半:
v1 = 1, 2, 3 v2 = 4, 5, 6
按先递增读取v2,再递减读取v1的交替顺序输出,最终得到结果:
4, 3, 5, 2, 6, 1
已尝试的实现思路
1. 拆分反转法
- 操作:创建两个新vector,反转前半段v1后交替读取v2和反转后的v1
- 优缺点:逻辑简单,适合小型vector;但大型vector下会占用额外内存,且复制反转操作耗时
2. 自定义迭代器法
- 操作:实现自定义迭代器,通过交替正负的递增步长遍历原vector(比如示例中从索引3开始,依次减1、加2、减3...)
- 优缺点:无需额外内存,原地遍历;但需要处理复杂的迭代终止条件,实现复杂度高
3. 环形取模法
- 操作:将vector视为环形结构,通过交替正负步长结合取模运算实现遍历,代码如下:
// MRE_middleOut.c // 编译命令:g++ -std=c++11 MRE_middleOut.c -o MRE_middleOut #include <stdlib.h> #include <vector> using namespace std; inline int positive_modulo(int i, int n) { return (i % n + n) % n; } int main(int argc, char *argv[]) { int N = strtol( argv[1], NULL, 10); vector<int> v; for ( int i=0; i<N; i++ ) v.push_back( i+1 ); int index = round( N / 2 ); int sign = 1; printf( "%d, ", v[index] ); for ( int stepSize=(N-1); stepSize>0; stepSize-- ) { index = positive_modulo( (index + sign*stepSize), N ); sign *= -1; printf( "%d, ", v[index] ); } printf( "\n" ); }
- 运行结果示例:
$ ./MRE_middleOut 20 11, 10, 12, 9, 13, 8, 14, 7, 15, 6, 16, 5, 17, 4, 18, 3, 19, 2, 20, 1,
- 优缺点:原地操作、速度快且能覆盖所有元素;但代码可读性差,还需额外处理C/C++中负数取模的特殊逻辑
问题
是否存在更优雅的实现方式?
内容的提问来源于stack exchange,提问作者Mark Bower
相关产品推荐
相关产品推荐

