我有以下函数,它在给定范围内生成一个整数:
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的行时,一切都很好。
有人能够解释这个问题吗?
答案 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)。该 函数应返回一个值 零和它的论点(低于 这一点)。