C++如何正确使用std::find
C++ how to use std::find properly
我有一个关于 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
所以问题是函数 std::find(randNums, randNums + 4, newRandNum);
中的第二个参数 randNums + 4
是做什么的?
此外,这段代码的想法是生成一个从 0 到 9 的数字,并确保没有任何双数,例如数字 3 没有使用 2 次。但我看到当数组的第一个生成数 (randNums[0]) 为零时,程序认为字符串中已经有一个零,因此它跳过它并生成另一个数字。你能解释一下为什么会发生这种情况以及如何解决它吗?
www.cplusplus.com 应该是 link,但我仅限于两个 links..所以..抱歉。对于代码和问题中的任何错误,我们深表歉意。
您正在使用的 std::find
函数有 3 个参数:
- 指向序列开头的指针(迭代器),
- 指向序列末尾(最后一个槽 + 1)的指针(迭代器)
- 要查找的值。
你说的例子:
std::find(randNums, randNums + 4, newRandNum);
正在搜索:
序列开头(randNums
),
序列的结尾(randNums + 4
)或开始后的 4 个位置,
对于值 newRandNum
。
还搜索:指针算法、迭代器加法。
您可以使用 -1 初始化 randNum 列表。
参考文献:
首先,最后
输入迭代器到序列中的初始和最终位置。搜索的范围是[first,last),包含first和last之间的所有元素,包括first指向的元素,不包括last指向的元素
我可能错了,但我有预感这是最后一部分(粗体)让你有点困惑。 "last"位置是独占的,所以不会被搜索到。
因此,对于您的 4 元素数组:
要搜索元素 0、1、2 和 3,您需要 [0,4) 的范围(注意括号而不是括号 - 分别是排除与包含)
编辑添加:至于第二部分 - 这只是一个初始化问题,我想你的 int[4] 是用 4 个零创建的...
如果你想避免这种情况,你必须跟踪你加载的内容,并且只搜索有效范围。当然,如果你按照
,你的第一个 rand() 需要放在 [0]
The range searched is [first,last), which contains all the elements between first and last, including the element pointed by first but not the element pointed by last. - std::find
最后一个是将在数组中搜索标准 std::find
函数值的元素数,例如:
std::find(randNums, randNums + 4, newRandNum);
这里指定的范围是从randNums
中的第一个元素到randNums + 4 - 1
。这意味着将在 randNums
和 randNums + 3
的开头之间搜索值 newRandNum
,包括这 2 个值。
找到第二个问题的答案。我应该将 randNums 的内容设置为不同于 0-9 的整数。
我有一个关于 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
所以问题是函数 std::find(randNums, randNums + 4, newRandNum);
中的第二个参数 randNums + 4
是做什么的?
此外,这段代码的想法是生成一个从 0 到 9 的数字,并确保没有任何双数,例如数字 3 没有使用 2 次。但我看到当数组的第一个生成数 (randNums[0]) 为零时,程序认为字符串中已经有一个零,因此它跳过它并生成另一个数字。你能解释一下为什么会发生这种情况以及如何解决它吗?
www.cplusplus.com 应该是 link,但我仅限于两个 links..所以..抱歉。对于代码和问题中的任何错误,我们深表歉意。
您正在使用的 std::find
函数有 3 个参数:
- 指向序列开头的指针(迭代器),
- 指向序列末尾(最后一个槽 + 1)的指针(迭代器)
- 要查找的值。
你说的例子:
std::find(randNums, randNums + 4, newRandNum);
正在搜索:
序列开头(randNums
),
序列的结尾(randNums + 4
)或开始后的 4 个位置,
对于值 newRandNum
。
还搜索:指针算法、迭代器加法。
您可以使用 -1 初始化 randNum 列表。
参考文献: 首先,最后 输入迭代器到序列中的初始和最终位置。搜索的范围是[first,last),包含first和last之间的所有元素,包括first指向的元素,不包括last指向的元素
我可能错了,但我有预感这是最后一部分(粗体)让你有点困惑。 "last"位置是独占的,所以不会被搜索到。
因此,对于您的 4 元素数组: 要搜索元素 0、1、2 和 3,您需要 [0,4) 的范围(注意括号而不是括号 - 分别是排除与包含)
编辑添加:至于第二部分 - 这只是一个初始化问题,我想你的 int[4] 是用 4 个零创建的...
如果你想避免这种情况,你必须跟踪你加载的内容,并且只搜索有效范围。当然,如果你按照
,你的第一个 rand() 需要放在 [0]The range searched is [first,last), which contains all the elements between first and last, including the element pointed by first but not the element pointed by last. - std::find
最后一个是将在数组中搜索标准 std::find
函数值的元素数,例如:
std::find(randNums, randNums + 4, newRandNum);
这里指定的范围是从randNums
中的第一个元素到randNums + 4 - 1
。这意味着将在 randNums
和 randNums + 3
的开头之间搜索值 newRandNum
,包括这 2 个值。
找到第二个问题的答案。我应该将 randNums 的内容设置为不同于 0-9 的整数。