You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从中间向外输出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 10:35:58