函数期望参数无需工作(C ++)

时间:2017-08-06 18:48:54

标签: c++ permutation

以下是相关代码。取自cplusplus.com。我的问题是,如果在main方法中没有任何东西被传递给myrandom,myrandom是如何工作的。

我认为,由于它的签名,编译器会抛出一个错误,但它不仅没有,它完全符合我的要求,所以它是如何工作的?

非常感谢。

新程序员参加数据结构课程。如果我在问这个问题时怎么搞砸了,请告诉我。

聚苯乙烯。这只是HW的一小部分。问题集实际上是关于链表和BST中的搜索效率,这就是排列是必要的原因。

// random_shuffle example
#include <iostream>     // std::cout
#include <algorithm>    // std::random_shuffle
#include <vector>       // std::vector
#include <ctime>        // std::time
#include <cstdlib>      // std::rand, std::srand

// random generator function:
int myrandom (int i) { return std::rand()%i;}

int main () {
  std::srand ( unsigned ( std::time(0) ) );
  std::vector<int> myvector;

  // set some values:
  for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9

  // using built-in random generator:
  std::random_shuffle ( myvector.begin(), myvector.end() );

  // using myrandom:
  std::random_shuffle ( myvector.begin(), myvector.end(), myrandom);

  // print out content:
  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;

  std::cout << '\n';

  return 0;
}

1 个答案:

答案 0 :(得分:4)

在cppreference中,您可以看到std::random_shuffle的可能实现,并且您将看到它是如何工作的:

template<class RandomIt, class RandomFunc>
void random_shuffle(RandomIt first, RandomIt last, RandomFunc&& r)
{
    typename std::iterator_traits<RandomIt>::difference_type i, n;
    n = last - first;
    for (i = n-1; i > 0; --i) {
        using std::swap;
        swap(first[i], first[r(i+1)]);
    }
}

在你的行中:

std::random_shuffle ( myvector.begin(), myvector.end(), myrandom);

你没有调用myrandom,你只是将函数作为参数传递。然后,该参数将用于使用某个参数调用该函数,如您在可能实现的这一行中所示:

swap(first[i], first[r(i+1)]);

r是保存myrandom函数的变量。