我在www.cplusplus.com上有一篇关于一篇文章的问题,而且关于std::find的问题是算法库中的函数。这是我的代码。
randnum.cpp中的代码:
#include "randnum.h"
void randNum (char timeATM)
{
int *p, newRandNum;
srand (timeATM);
for (int i = 0; i < 4; i++)
{
newRandNum = rand() % 10;
p = std::find(randNums, randNums + 4, newRandNum);
if (p != randNums + 4)
{
std::cout << "!found! at " << i + 1 << "| num " << *p << std::endl;
i = i - 1;
}
else
{
randNums[i] = Nums[newRandNum];
std::cout << "all ok; at " << i + 1 << "| num " << randNums[i] << std::endl;
}
}
}
randnum.h中的代码:
#ifndef RANDNUM_H
#define RANDNUM_H
#include <iostream>
#include <stdlib.h>
#include <time.h>
int Nums [10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int randNums [4];
#endif // RANDNUM_H
所以问题是函数randNums + 4
中的第二个参数std::find(randNums, randNums + 4, newRandNum);
是做什么的?
这段代码的想法是生成一个从0到9的数字,并确保没有任何加倍的数字,例如,数字3不使用2次。但我看到当第一个生成的数组(randNums [0])为零时,程序判定字符串中已经存在零,因此它会跳过它并生成另一个数字。你能解释一下为什么会发生这种情况以及如何解决它?
www.cplusplus.com应该是链接,但我只限于两个链接..所以..抱歉。对于代码和问题中的任何错误感到抱歉。
答案 0 :(得分:1)
来自参考: 第一,最后 将迭代器输入到序列中的初始位置和最终位置。搜索的范围是[first,last),其中包含first和last之间的所有元素,包括第一个指向的元素,但不包括last指向的元素。
我可能会弄错,但我有预感,最后一部分(粗体)让你感到困惑。 &#34;最后&#34;位置是完全的,因此,它不会被搜索。
对于4元素数组,因此: 要搜索元素0,1,2和3,你需要一个范围[0,4](注意paren而不是括号 - 分别排除vs包含)
编辑添加:至于第二部分 - 这只是一个初始化问题,我想你的int [4]是用4个零创建的......
如果您想避免这种情况,您必须跟踪已加载的内容,并且只搜索有效范围。当然,如果你按照
,你的第一个rand()需要被放到[0]答案 1 :(得分:0)
您使用的std::find
函数有3个参数:
您所说的例子:
std::find(randNums, randNums + 4, newRandNum);
正在搜索:
序列的开头(randNums
),
序列的结尾(randNums + 4
)或开头后的4个位置,
值newRandNum
。
还搜索:指针算术,迭代器添加。
答案 2 :(得分:0)
您可以使用-1初始化randNum列表。
答案 3 :(得分:0)
搜索的范围是[first,last),其中包含first和last之间的所有元素,包括由first指向的元素,但不包括last指向的元素。 - std::find
最后一个是在数组中搜索标准std::find
函数中的值的元素数量,如:
std::find(randNums, randNums + 4, newRandNum);
此处指定的范围是randNums
到randNums + 4 - 1
中的第一个元素。这意味着将在newRandNum
和randNums
的开头之间搜索值randNums + 3
,包括这两个值。
答案 4 :(得分:0)
找到第二个问题的答案。我应该将randNums的内容设置为一个不同于0-9的整数。