将元素从一个数组复制到另一个数组c ++

问题描述 投票:0回答:4

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

我有一个生成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] << " , ";
  }

}
c++ arrays divide-and-conquer
4个回答
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] << " , ";
    }

}

0
投票

问题:

该程序不能保证没有重复值,因为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] << " , ";
    }

0
投票

当你用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;
}

编辑:正如您在评论中提到的,您只想在数组中找到一个数字,那么如何:

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

0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.