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. 指向序列开头的指针(迭代器),
  2. 指向序列末尾(最后一个槽 + 1)的指针(迭代器)
  3. 要查找的值。

你说的例子:
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。这意味着将在 randNumsrandNums + 3 的开头之间搜索值 newRandNum,包括这 2 个值。

找到第二个问题的答案。我应该将 randNums 的内容设置为不同于 0-9 的整数。