繁体   English   中英

如何通过 C++ 将一个数组改造成两个更小的数组?

How to remake one array into two smaller via C++?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我需要从一个 10 元素数组制作两个 5 元素数组。 我做了这样的代码

#include <iostream>
using namespace std;

int main() {
    const int size1 = 10, size2 = 5;

    int array[size1]{ 1,3,6,2,82,10,6,34,2,5 }, arb[size2]{}, arc[size2]{};

    for (size_t i = 0; i < 5; i++)
    {
        arb[i] = array[i];
    }
    for (size_t i = 5; i < 9; i++) {
        
        for (size_t e = 0; e < 4; e++)
        {
            arc[e] = array[i];
        }
        
    }

    for (size_t i = 0; i < 5; i++)
    {
        cout << arb[i] << "\t";
    }
    cout << endl;

    for (size_t i = 0; i < 5; i++)
    {
        cout << arc[i] << "\t";
    }
}

但是第二个数组给出了“2 2 2 2 0”。 我没有任何想法如何解决这个问题。

6 个回复

除非你有一个特定的原因,这些必须是数组(这非常罕见,至少在我的经验中),否则我会使用std::vector s。 这使得用较大的正确部分初始化较小的“数组”变得微不足道:

std::vector<int> array { 1,3,6,2,82,10,6,34,2,5 };
std::vector<int> arb { array.begin(), array.begin() + size2};
std::vector<int> arc { array.begin() + size2, array.end() };

这也使得(例如)将主数组一分为二变得容易,无论其确切大小如何:

std::vector<int> array { 1,3,6,2,82,10,6,34,2,5, 12, 17, 92, 101, -3 };
auto half = array.size() / 2;
std::vector<int> arb { array.begin(), array.begin() + half};
std::vector<int> arc { array.begin() + half, array.end() };

[就目前而言,如果主数组具有奇数个元素,这将使后半部分更大,但如果这不是您想要的,您可以更改half的计算以满足您的需要。]

这些嵌套循环

for (size_t i = 5; i < 9; i++) {
    
    for (size_t e = 0; e < 4; e++)
    {
        arc[e] = array[i];
    }
    
}

没有意义。 此外,还使用了未知的幻数94 事实上,除了最后一个元素之外,数组arc所有元素都被设置为元素array[8]的值,也就是在外循环的最后一次迭代中使用的数组array元素的值。

该程序可以如下所示

#include <iostream>

int main() 
{
    const size_t size1 = 10, size2 = 5;

    int array[size1]{ 1,3,6,2,82,10,6,34,2,5 }, arb[size2]{}, arc[size2]{};

    for ( size_t i = 0; i < size2; i++ )
    {
        arb[i] = array[i];
    }
    
    for ( size_t i = 0; i < size2; i++ )
    {
        arc[i] = array[i + size2];
    }
    
    for ( const auto &item : arb )
    {
        std::cout << item << ' ';
    }
    
    std::cout << '\n';
    
    for ( const auto &item : arc )
    {
        std::cout << item << ' ';
    }
    
    std::cout << '\n';
    
    return 0;
}

程序输出是

1 3 6 2 82 
10 6 34 2 5 

或者,您可以使用标准算法std::copystd::copy_n 例如

#include <iostream>
#include <algorithm>
#include <iterator>
#include <algorithm>

int main() 
{
    const size_t size1 = 10, size2 = 5;

    int array[size1]{ 1,3,6,2,82,10,6,34,2,5 }, arb[size2]{}, arc[size2]{};

    std::copy_n( std::begin( array ), size2, std::begin( arb ) );
    std::copy_n( std::next( std::begin( array ), size2 ), size2, std::begin( arc ) );
    
    for ( const auto &item : arb )
    {
        std::cout << item << ' ';
    }
    
    std::cout << '\n';
    
    for ( const auto &item : arc )
    {
        std::cout << item << ' ';
    }
    
    std::cout << '\n';
    
    return 0;
}

程序输出与上图相同。

1 3 6 2 82 
10 6 34 2 5 

您通过第二次迭代在第二个循环中犯了错误,在这个循环之后,您只设置了新数组中的最后一个元素......

这是代码的正确版本:

#include <iostream>

int main() {
  const int size1 = 10, size2 = 5;

  int array[size1]{ 1, 3, 6, 2, 82, 10, 6, 34, 2, 5 };
  int arb[size2]{};
  int arc[size2]{};

  for (size_t i = 0; i < 5; i++) {
    arb[i] = array[i];
  }
  for (size_t i = 5; i < 10; i++) {
    arc[i-5] = array[i];
  }

  for (size_t i = 0; i < 5; i++) {
    std::cout << arb[i] << "\t";
  }
  std::cout << std::endl;

  for (size_t i = 0; i < 5; i++) {
    std::cout << arc[i] << "\t";
  }
}

另外,我建议使用std::copy的代码更简单的版本:

#include <iostream>

int main() {
  const int size1 = 10, size2 = 5;

  int array[size1]{ 1, 3, 6, 2, 82, 10, 6, 34, 2, 5 };
  int arb[size2]{};
  int arc[size2]{};

  std::copy(&array[0], &array[5], arb);
  std::copy(&array[5], &array[10], arc);

  for (size_t i = 0; i < 5; i++) {
    std::cout << arb[i] << "\t";
  }
  std::cout << std::endl;

  for (size_t i = 0; i < 5; i++) {
    std::cout << arc[i] << "\t";
  }
}

问题出在嵌套的for循环中

for (size_t i = 5; i < 10; i++)
{ 
    //essentially what you're doing in this loop is that for each element 5, 6, 7, 8, 9 
    // for the first loop you are assigning for instance arc[0] till arc[3] to be all equal to array[5]
    // so whats happening is n=by the time you reach arc
    // take care you are assigning only 4 elements

    for (size_t e = 0; e < 4; e++)          // size here 
    {
        arc[e] = array[i];
    }

}

另一种方法是这样做:

for (size_t i = 0; i < size2; i++)
{
    arc[i] = array[i+5];
}

让我们试试脏变体,O(1)

警告如果数组在 arb 或 arc 之前超出范围,这将在您的脸上爆炸

int main() {
    const int size1 = 10, size2 = 5;

    int array[size1]{ 1,3,6,2,82,10,6,34,2,5 };
    int *arb = array, *arc = &array[size2];

    for (size_t i = 0; i < size2; i++) {
        cout << arb[i] << "\t";
    }
    cout << endl;

    for (size_t i = 0; i < size2; i++) {
        cout << arc[i] << "\t";
    }
}

使用memcpy复制普通旧值类型的数组。

memcpy(arb, array, size2);
memcpy(arc, array+size2, size2);

这两个语句都替换了您的两个 for 循环。

通过在源文件的顶部声明#include <string.h>可以使用memcpy函数。

2 C++:将两个数组传入一个函数,但结果出乎我的意料

我是新的 C++ 程序员,刚开始做一些练习。 我想出了以下代码,但没有得到我自己预期的结果(很可能我错了,但我无法理解)。 我真的很感谢你的建议: 这是我的代码: 结果给出 2.2 而我期望 3.3 因为:在两次循环之后,u 变为零,因此无法执行第三次循环,因为我们执行了两次循环,i 变为 2 ...

2019-11-14 19:44:31 1 34   c++
3 如何在C ++中将两个数组变成一个函数?

我有两个字符串数组“ Array1 [size]”和“ Array2 [size]”。 它们的大小相同。 我想编写一个包含这两个数组的函数,但是在声明它们的方式上遇到问题。 我这样声明: void Thefunction (string&amp; Array1[], string&am ...

4 当我只想反转其中一个数组时,为什么我的两个数组都处于相反的顺序? [C++]

尝试创建各种回文检查器,其中一个过程涉及反转数组。 用户输入要输入的字符数,将字符一个一个输入,代码本身会判断是否是回文(同样的单词倒过来,racecar 拼写为racecar backs )。 问题是,我需要反转一个数组来创建一个条件,但我的代码却反转了我的两个数组。 下面是代码。 ...

5 两个数组是否等于函数c ++ [重复]

这个问题已经在这里有了答案: 在C ++中比较数组是否相等 9答案 我正在尝试做与数组比较的函数,如果它们相同则返回true。 现在,数组很简单,稍后将进行高级介绍,但我testEqual于testEqual函数。 所以这是代码 这是testEqual函 ...

6 比较C ++中两个数组的2个元素

我有两个数组,每个数组都有一些值,例如: 现在我需要将数组(a)的元素与数组(b)中的元素进行比较..如果有任何匹配程序应该返回错误或打印“错误有重复值”等等。在上述情况,它应该返回一个错误coz a [0] = b [1],因为它们都有相同的值。 我怎样才能做到这一点?? ...

7 如何在C++上比较两个数组上的元素

一个 c ++ 问题,我必须确定用户是否击中了目标。 输入敌人可能所在的坐标后,用户然后输入更多坐标,我必须比较它们,如果攻击的元素 [i] 与敌人 [n] 的任何元素匹配,则打印 YES。 我知道我在比较位置而不是元素,这就是为什么它不起作用但我迷路了。我也试图通过只制作一个数组来解决它,但这样感 ...

8 在C ++程序中合并两个数组

我想在C ++程序中将两个数组合并为一个。 例如: 我想将它们作为C中的列向量。例如,在MATLAB中,我可以使用C = [A; B]。 最简单的方法是什么? ...

9 c++ 从函数中返回两个数组

我使用二分法找到了方程的解。 我需要在某些迭代中找到a和b的值。 因此,我分别为这些点制作了两个数组。 为了从函数中“拉出”迭代次数,我没有问题。 它们显示在屏幕上。 但是如何“拉出”这两个数组呢?请告诉我怎么做。 先感谢您! ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM