【问题标题】:Transfering/Segregating certain elements of an array to other arrays将数组的某些元素转移/分离到其他数组
【发布时间】:2015-01-16 09:01:24
【问题描述】:

假设用户将数字 10、11、22、33、44、55、66、77、88 和 99 输入到数组中。然后程序必须将低于 50 和高于 50 的数字分成两个不同的数组,即 array2 和 array3。但是当我运行我的程序时,它会在 array2 和 array3 中显示一些垃圾内存。

我的程序将与显示器一起运行:

array1 中的数字

10, 11, 22, 33, 44, 55, 66, 77, 88, 99

array2 中的数字

1972394090, 22, 33, 44, 0, 4202032, 2686624, 2686680, 2686924, 10, 11

array3 中的数字

2686700, 4202032, 0, 2686604, 55, 66, 77, 88, 99, 1972394134, 1972394090

这是我的功能码(N定义为10)

void segArr(int array[N], int array2[N], int array3[N])
{

    int i;


    for(i=1; i<N; i++)
    {
        if(array[i]<50)
            array2[i]=array[i];
        if(array[i]>50)
            array3[i]=array[i];
    }

    return;
}

【问题讨论】:

  • 您希望元素(例如 array2[1])包含什么?您没有为其分配任何内容,因此它将包含随机位。 我建议在提问之前先学习 C++

标签: c++ c arrays


【解决方案1】:

也许你想做这样的事情:

const int split=50;
int n2=0, n3=0;
for(int i1=0; i1!=n1; ++i1)
  if(array1[i1] < split)
    array2[n2++] = array1[i1];
  else
    array3[n3++] = array1[i1];
// n2,n3 now hold the filled sizes of array2 and array3

当然,使用std 容器可以更好地完成这一切……特别是,您可能对std::partitionstd::stable_partition 感兴趣,它们重新排列数组/容器中的顺序或元素。

【讨论】:

    【解决方案2】:

    首先,数组索引从 0 而不是 1 开始。其次,您确实在复制感兴趣的数组元素,但无论在 array2array3 中的旧数组内容都不会首先被清除,而且显然是'也没有在调用代码中设置:这就是为什么当你打印数组元素时你会看到像1972394090这样的“垃圾”值,尽管从技术上讲,甚至尝试打印一个未初始化的值都是未定义的行为,你同样可以让程序中止或其他故障。

    您可能想要这样做:

    void segArr(int array[N], int array2[N], int array3[N])
    {
        size_t i2 = 0, i3 = 0;
        for (size_t i = 0; i < N; ++i)
        {
            if (array[i] < 50)
                array2[i2++] = array[i];
            else if (array[i] > 50)
                array3[i3++] = array[i];
        }
        if (i2 < N) array2[i2] = 50;
        if (i3 < N) array3[i3] = 50;
    }
    

    这样您就可以打印出 array2array3 元素 0 到 N-1,如果您看到 50 值,请提前停止。 (我使用 50 作为结果结束 sentinel 值,因为它是您在 array2array3 中永远不可能拥有的唯一整数值​​。)

    【讨论】:

    • @Walter:是的,非常刻意......只有每个开始的元素 - 直到标记值 50 或元素 [N-1] 如果没有 50 - 不会是垃圾。当哨兵清楚地表明有意义的数据在哪里停止时,我认为没有必要浪费时间/代码将这些元素设置为垃圾以外的任何东西。当你循环打印它们时,当你看到 50 时停止,所有之前打印的值都不应该是垃圾。
    • 糟糕,抱歉,我显然没有完整阅读您的答案(但只有代码)
    【解决方案3】:

    这是因为你可能这样声明向量:

    std::vector<int> array2(10);
    

    并显示该向量中的每个元素。如果某些元素为空,则显示随机数据。

    你应该只创建向量,而不是使用 push_back() f.e.

    if(array[i]>50)
    array2.push_back(array[i]);
    

    【讨论】:

      猜你喜欢
      • 2017-11-24
      • 1970-01-01
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-10
      • 2011-06-29
      相关资源
      最近更新 更多