将元素从一个数组复制到另一个 c++
Copying elements from one array to another c++
我看了又看,仍然不知道如何从数组中复制或获取元素并将它们放入新数组中(分而治之是目标)。
我有一个生成 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] << " , ";
}
}
分而治之"相当容易;当复制到NumbersA
等时,你只需要使用适当的偏移量访问你的Originnumbers
,即 0
、25
、50
和75
:
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] << " , ";
}
}
问题:
该程序不能保证没有重复值,因为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] << " , ";
}
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";
}
}
在某些情况下,即使在C++上,使用数组可能比向量更可取,例如,在处理需要在内存上连续和排序的多维数组(2D、3D 等)时。(例如,以后由其他应用程序访问或使用HDF5等格式更快地导出到文件。
正如Jesper指出的那样,您可以使用Copy,我会添加MemCopy将数组或内存块的内容复制到另一个数组或内存块中。
不要低估指针的重要性,它们可以在不需要做任何复制的情况下解决你的问题。有点像 Stephan 解决方案,但不需要索引变量"i",只需在数组的不同位置初始化指针即可。对于非常多的元素,这样的策略将节省一些相关的处理时间。
- 在数组中使用C++中的哈希表复制数组中的元素
- 快速复制数组到阵列
- 如何在C 中复制数组
- 赋值运算符复制数组中除可用空间之外的所有内容
- 尝试复制数组时从 DLL 调用函数时程序崩溃
- 反向复制数组
- 复制数组 - 将数组加倍后崩溃
- 复制数组和气泡排序 C++
- 在结构中复制构造函数:是否复制数组
- 如何从类中复制数组并将新数组的大小加倍
- 在C++中复制数组的麻烦
- 逐行复制数组的内容
- tictactoe和复制数组
- 正在使用数组的名称strring复制数组
- c++复制数组到数组
- . net互操作是来回复制数组数据,还是固定数组?
- 从通过函数发送的结构体中复制数组
- 使用CUDA Thrust置换迭代器复制数组的特定元素
- C/ c++中有复制数组的函数吗?
- 在引用中复制数组