C ++如何正确使用std :: find

时间:2017-03-15 21:47:37

标签: c++ arrays int find qt-creator

我在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应该是链接,但我只限于两个链接..所以..抱歉。对于代码和问题中的任何错误感到抱歉。

5 个答案:

答案 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个参数:

  1. 指针(迭代器)到序列的开头,
  2. 指针(迭代器)到序列结尾(最后一个插槽+ 1)
  3. 要找的价值。
  4. 您所说的例子:
    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);

此处指定的范围是randNumsrandNums + 4 - 1中的第一个元素。这意味着将在newRandNumrandNums的开头之间搜索值randNums + 3,包括这两个值。

答案 4 :(得分:0)

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