C++ 用两个两个交替的元素混合两个阵列

C++ 用两个两个交替的元素混合两个阵列,c++,algorithm,C++,Algorithm,什么是一种优雅的算法,可以将元素两个接两个地混合在两个数组中(可能大小不同),以便从每个数组中交替绘制项目,并将剩余部分添加到末尾 例如 不要担心空检查或任何其他边缘情况,我会处理这些问题。 以下是我的解决方案,但它不能正常工作: for (i = 0; i < N; i++) { arr[2 * i + 0] = A[i]; arr[2 * i + 1] = A[i+1]; arr[2 * i + 0] = B[i]; arr[2 * i +

什么是一种优雅的算法,可以将元素两个接两个地混合在两个数组中(可能大小不同),以便从每个数组中交替绘制项目,并将剩余部分添加到末尾

例如

不要担心空检查或任何其他边缘情况,我会处理这些问题。 以下是我的解决方案,但它不能正常工作:

for (i = 0; i < N; i++) {
     arr[2 * i + 0] = A[i];
     arr[2 * i + 1] = A[i+1]; 

     arr[2 * i + 0] = B[i];
     arr[2 * i + 1] = B[i+1];
}
(i=0;i{ arr[2*i+0]=A[i]; arr[2*i+1]=A[i+1]; arr[2*i+0]=B[i]; arr[2*i+1]=B[i+1]; }
关于循环的一些注释

  • 使用结果数组中的相同位置
    arr
    为其分配两个值(一个来自
    A
    ,一个来自
    B
  • <> LI>索引的计算可能比它需要的更复杂,考虑使用两个索引器,因为您对数组进行索引的方式有两种: 我建议您使用具有两个索引器(
    I
    j
    )的循环,并显式循环结果的四个元素(即每个输入数组的两个位置)。在每个循环中,适当地增加索引器(输出数组增加4,输入数组增加2)

    #包括
    int main()
    {
    使用名称空间std;
    constexpr int N=4;
    int A[N]={2,4,6,8};
    int B[N]={1,3,5,7};
    int-arr[N*2];
    对于(自动i=0,j=0;i
    
    for (i = 0; i < N; i += 2) {
         arr[2 * i + 0] = A[i];
         arr[2 * i + 1] = A[i+1]; 
    
         arr[2 * i + 2] = B[i];
         arr[2 * i + 3] = B[i+1];
    }
    
    (i=0;i{ arr[2*i+0]=A[i]; arr[2*i+1]=A[i+1]; arr[2*i+2]=B[i]; arr[2*i+3]=B[i+1]; }

    没有考虑任何拐角的情况,只是修正了你的概念。例如,检查是否有任何数组索引出现越界。你可以运行Live。< /P> < P>非常明确地计算数组索引,特别是如果你的数组可以是不同的,可能是奇数的长度。如果你保留三个单独的索引,则更容易。ach阵列:

    int pairwise(int c[], const int a[], size_t alen, const int b[], size_t blen)
    {
        size_t i = 0;       // index into a
        size_t j = 0;       // index into b
        size_t k = 0;       // index into c
    
        while (i < alen || j < blen) {
            if (i < alen) c[k++] = a[i++];
            if (i < alen) c[k++] = a[i++];
            if (j < blen) c[k++] = b[j++];
            if (j < blen) c[k++] = b[j++];
        }
    
        return k;
    }
    

    (例子是C,不是C++,但是你的代码不使用任何C++的容器,比如<代码> vector < /代码>,所以我使用了普通的int数组,它们具有明确的维度,在C和C++中是相同的。

    < P>它应该是这样的。

    for (i = 0; i < N; i+=2) {
         arr[2 * i + 0] = A[i];
         arr[2 * i + 1] = A[i+1];    
         arr[2 * i + 2] = B[i];
         arr[2 * i + 3] = B[i+1];
    }
    
    (i=0;i{ arr[2*i+0]=A[i]; arr[2*i+1]=A[i+1]; arr[2*i+2]=B[i]; arr[2*i+3]=B[i+1]; }
    请向我们展示您可能不合法的算法,我们将尝试从那里指导您我展示了我上面的算法n是每个数组的大小。我不知道如何解决此算法:(既然你在使用C++,为什么不使用<代码> STD::vector < /COD>而不是普通数组?这样可以节省一些计算;你可以在代码中添加元素> PuxSuffue/Cuth>在构建结果向量时。
    int pairwise(int c[], const int a[], size_t alen, const int b[], size_t blen)
    {
        size_t i = 0;       // index into a
        size_t j = 0;       // index into b
        size_t k = 0;       // index into c
    
        while (i < alen || j < blen) {
            if (i < alen) c[k++] = a[i++];
            if (i < alen) c[k++] = a[i++];
            if (j < blen) c[k++] = b[j++];
            if (j < blen) c[k++] = b[j++];
        }
    
        return k;
    }
    
    #define countof(x) (sizeof(x) / sizeof(*x))
    
    int main()
    {
        int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        int b[] = {-1, -2, -3, -4, -5, -6};
    
        int c[countof(a) + countof(b)];
        int i, n;
    
        n = pairwise(c, a, countof(a), b, countof(b));
    
        for (i = 0; i < n; i++) {
            if (i) printf(", ");
            printf("%d", c[i]);
        }
        puts("");
    
        return 0;
    }
    
    for (i = 0; i < N; i+=2) {
         arr[2 * i + 0] = A[i];
         arr[2 * i + 1] = A[i+1];    
         arr[2 * i + 2] = B[i];
         arr[2 * i + 3] = B[i+1];
    }