随机shuffle和函数指针

时间:2010-12-04 06:47:11

标签: c++ function-pointers

我有以下函数,它在给定范围内生成一个整数:

 18 int choosecard(){
 19     boost::uniform_int<> dist(0,51);
 20     boost::variate_generator< boost::mt19937&, boost::uniform_int<> > cardchoice(gen, dist);
 21     return cardchoice();
 22 }

我想用它作为std :: random_shuffle的参数,这样我就可以改组52个整数的向量。

 64     int (*pchoosecard)(void) = choosecard;
 65 
 66     std::random_shuffle(cards.begin(), cards.end(), pchoosecard);

但是我得到了这个我不明白的错误:

$ make
g++ -I /usr/local/boost_1_45_0/ -c main.cpp
In file included from /usr/include/c++/4.4/algorithm:62,
                 from /usr/local/boost_1_45_0/boost/any.hpp:13,
                 from /usr/local/boost_1_45_0/boost/program_options/value_semantic.hpp:12,
                 from /usr/local/boost_1_45_0/boost/program_options/options_description.hpp:13,
                 from /usr/local/boost_1_45_0/boost/program_options.hpp:15,
                 from main.cpp:1:
/usr/include/c++/4.4/bits/stl_algo.h: In function ‘void std::random_shuffle(_RAIter, _RAIter, _Generator&) [with _RAIter = __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, _Generator = int (*)()]’:
main.cpp:66:   instantiated from here
/usr/include/c++/4.4/bits/stl_algo.h:4998: error: too many arguments to function
make: *** [main.o] Error 1

当我注释掉调用std :: random_shuffle的行时,一切都很好。

有人能够解释这个问题吗?

2 个答案:

答案 0 :(得分:1)

“参数太多”因为std::random_shuffle试图将过多的参数传递给你给它的回调。所以它真的太强很少参数。

你的choosecard应该接受一个ptrdiff_t类型的参数,它基本上告诉函数元素的数量。 (你不应该硬编码这个函数中的卡数。)所以你把它插入boost::uniform_dist构造函数。

答案 1 :(得分:1)

来自http://www.cplusplus.com/reference/algorithm/random_shuffle/

template <class RandomAccessIterator, class RandomNumberGenerator>
void random_shuffle ( RandomAccessIterator first, RandomAccessIterator last,
                      RandomNumberGenerator& rand );
  

第一个,最后一个

     

将迭代器转发到初始和最终    序列的位置   被洗牌。使用的范围是   [第一个,最后一个),其中包含所有   第一个和最后一个元素,   包括第一个指向的元素   但不是最后指向的元素。

     

<强>兰特

     

指向一元函数的指针取一个参数并返回一个值,   两者都有适当的区别   type(通常是ptrdiff_t)。该   函数应返回一个值   零和它的论点(低于   这一点)。