【问题标题】:Copying elements from one array to another c++将元素从一个数组复制到另一个 C++
【发布时间】:2018-04-19 12:23:38
【问题描述】:

我看了又看,仍然迷失在如何从数组中复制或获取元素并将它们放入新数组中(目标是分而治之)。

我有一个生成 100 个随机数的数组。我需要将随机数拆分为 4 个较小的数组,显然包含 25 个元素并且没有任何重复项。我读过关于使用指针的文章,但老实说,我不明白为什么还要使用指针。为什么我关心另一个变量地址?

我不知道该怎么做。到目前为止,这是我的代码:

#include <iostream>
#include <time.h>
#include <stdlib.h>

using namespace std;


int main()
{
  // Seed the random number generator

  srand(time(NULL));

  //create an array to store our random numbers in

  int Orignumbers[100]    = {};
  // Arrays for the divide and conquer method
  int NumbersA   [25]     = {};
  int NumbersB   [25]     = {};
  int NumbersC   [25]     = {};
  int NumbersD   [25]     = {};


  //Generate the random numbers
  for(int i =0; i < 100; i++)
  {
    int SomeRandomNumber = rand() % 100 + 1;

  // Throw random number into the array

  Orignumbers[i] = SomeRandomNumber;

  }

//  for(int i = 0; i < ) started the for loop for the other arrays, this is where I am stuck!!

  // Print out the random numbers
  for(int i = 0; i < 100; i++)
  {
    cout << Orignumbers[i] << " , ";
  }

}

【问题讨论】:

  • 如果Orignumbers 数组中的前 100 个数字不是不同的怎么办?那么根据鸽巢原理,您不能拥有任何大小为 25 且具有 25 个不同值的数组。您显然会在 4 个数组中至少有一个重复。
  • 使用std::vector(或std::array 用于固定大小),而不是原始数组。最好使用&lt;random&gt; 设施而不是旧的srand 等。如果您想要连续序列中没有重复的随机数,请考虑改组。

标签: c++ arrays divide-and-conquer


【解决方案1】:

“分而治之”相当容易;当复制到NumbersA 等时,您只需使用适当的偏移量访问您的Originnumbers,即0255075

for(int i = 0; i < 25; i++) {
    NumbersA[i] = Orignumbers[i];
    NumbersB[i] = Orignumbers[i+25];
    NumbersC[i] = Orignumbers[i+50];
    NumbersD[i] = Orignumbers[i+75];
}

关于“不重复”的事情有点棘手。生成唯一数字的随机序列通常通过“洗牌”来解决。标准库为此提供了函数:

#include <random>
#include <algorithm>
#include <iterator>
#include <vector>

int main()
{
    std::random_device rd;
    std::mt19937 g(rd());

    int Orignumbers[100];

    //Generate the random numbers without duplicates
    for(int i =0; i < 100; i++) {
        Orignumbers[i] = i+1;
    }
    std::shuffle(Orignumbers, Orignumbers+100, g);

    // Arrays for the divide and conquer method
    int NumbersA   [25]     = {};
    int NumbersB   [25]     = {};
    int NumbersC   [25]     = {};
    int NumbersD   [25]     = {};


    for(int i = 0; i < 25; i++) {
        NumbersA[i] = Orignumbers[i];
        NumbersB[i] = Orignumbers[i+25];
        NumbersC[i] = Orignumbers[i+50];
        NumbersD[i] = Orignumbers[i+75];
    }

    // Print out the random numbers
    for(int i = 0; i < 100; i++)
    {
        cout << Orignumbers[i] << " , ";
    }

}

【讨论】:

    【解决方案2】:

    问题:

    程序不能保证没有重复值,因为rand()函数可以生成任何随机序列,并且可能包含99次的十进制值99虽然概率非常低但机会是.
    示例:

    for(loop=0; loop<9; loop++) 
    printf("%d", Rand()%10);
    

    如果循环 10 次,可能会产生一些值,例如:

      Output: 6,1,1,1,2,9,1,3,6,9
      Compiled Successfully:
    

    因此,不确定值不会重复

    可能的解决方案:

    可能有一个解决方案,您可以将值放在OriginalArray 中,并将rand() 生成的值与OriginalArray 值进行比较。 对于循环的第一次迭代,您可以直接将值分配给OriginalArray,然后从循环的第二次迭代中将rand() 值与OriginalArray 进行比较,但插入时间消耗可能高于 O(NN) 作为rand() 函数可能会重复值。

    可能的解决方案:

     #include <iostream>
     #include <time.h>
     #include <stdlib.h>
     using namespace std;
     int main()
     {
       int Orignumbers[100] ;
    
      int NumbersA [25] ,
        NumbersB [25] , 
        NumbersC [25] , 
        NumbersD [25] ;
        srand(time(NULL));
    
       for(int i =0; i < 100; i++){
        Orignumbers[i] = rand() % 100+1; 
       for(int loop=0; loop<i; loop++) {
           if(Orignumber[loop] == Orignumber[i] ) {
               i--;
               break;
            }
         }
      }
    
        //Placing in four different arrays thats maybe needed.
        for(int i = 0; i <25; i++ ) {
        NumbersA[i] = Orignumbers[i];
        NumbersB[i] = Orignumbers[i+25];
        NumbersC[i] = Orignumbers[i+50];
        NumbersD[i] = Orignumbers[i+75];
        } 
    
        for(int i = 0; i < 99; i++)
        cout << Orignumbers[i] << " , ";
        }
    

    【讨论】:

      【解决方案3】:

      当您使用 C++ 标记您的问题然后忘记老式数组时,让我们以 C++ 风格来做吧。 您想将您的数组拆分为 4 个数组,并且它们不应该重复的数字,因此您的原始数组中不能有 5 次数字,因为那肯定是一个你的 4 个数组中会有一个重复的,所以这是我建议的方法:

      #include <set>
      #include <ctime>
      #include <vector>
      
      int main() {
          std::multiset<int> allNums;
          std::srand(unsigned(std::time(0)));
      
          for (int i = 0; i < 100; ++i) {
              int SomeRandomNumber = std::rand() % 100 + 1;
              if (allNums.count(SomeRandomNumber) < 4) {
                  allNums.insert(SomeRandomNumber);
              }
              else {
                  --i;
              }
          }
          std::vector<int> vOne, vTwo, vThree, vFour;
          for (auto iter = allNums.begin(); iter != allNums.end(); ++iter) {
              vOne.push_back(*iter);
              ++iter;
              vTwo.push_back(*iter);
              ++iter;
              vThree.push_back(*iter);
              ++iter;
              vFour.push_back(*iter);
          }
          system("pause");
          return 0;
      }
      

      编辑:正如您在 cmets 中提到的,您只想在数组中找到一个数字,那么这个怎么样:

      for (int i = 0; i < 100; ++i) {
          if (origArray[i] == magicNumber) {
              cout << "magicNumber founded in index " << i << "of origArray";
          }
      }
      

      【讨论】:

      • 考虑改组。
      • @Cheers 和 hth。 - Alf 是的,改组是创建不同数字的最佳方法,但如果我的问题是正确的,25 个大小的数组不应该有重复的元素,所以原来的数组可以有重复的(每个最多 4 个)。
      • 我想我应该换个方式问这个问题。我根本不懂c++。我一般都在与这种语言和编程斗争。这是为算法类分配的。我不需要任何超乎寻常的东西,只需要易于实现的东西。我想整个重复的事情并不重要,我只是假设 25 * 4 是 100 和 100 个随机数,新数组中不会有重复。分配也就是在一个数组中一一搜索,直到我们找到一个“幻数”。
      • 那么我认为您只想使用@Stephan Lechner 答案的第一部分。但是请尝试了解您正在使用什么,毕竟您希望在课程结束时您的成绩是可以接受的。
      • @JFive575 要搜索数组的每个元素以查找不需要拆分的特定数字,请查看我的答案的编辑。
      【解决方案4】:

      在某些情况下,即使在 C++ 上,使用数组可能比向量更可取,例如,在处理需要在内存中连续和有序的多维数组(2D、3D 等)时。 (例如,稍后由其他应用程序访问或使用 HDF5 等格式更快地导出到文件。)

      就像 Jesper 指出的那样,您可以使用 Copy,我会添加 MemCopy 来将数组或内存块的内容复制到另一个中。

      不要低估指针的重要性,它们无需复制即可解决您的问题。有点像 Stephan 解决方案,但不需要索引变量“i”,只需在数组的不同位置初始化指针即可。对于非常多的元素,这样的策略会节省一些相关的处理时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-12
        • 1970-01-01
        • 1970-01-01
        • 2014-07-26
        • 2021-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多