我有一个 way to shuffle my std::vector
.具体来说,我使用 C++98 方法来实现:
void LoopGenerator::shuffle()
{
std::random_shuffle(stripes.begin(), stripes.end(), seed);
}
在哪里LoopGenerator
是一个以随机顺序抛出一些数据的类。 vector stripes
是这样定义的:
std::vector<Generator*> stripes;
Generator
是 LoopGenerator
的虚拟父类(super class).该 vector 应该允许包含和嵌套各种随机生成器,我将其用于 generating stripes。 .例如,生成 5-50 条细绿色条纹,然后生成粗棕色条纹:
问题是我的随机播放会抛出一个错误:
1> LoopGenerator.cpp
1>C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\algorithm(2181): error C2064: term does not evaluate to a function taking 1 arguments
1> C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\algorithm(2206) : see reference to function template instantiation 'void std::_Random_shuffle<random_stripes::Generator**,int,__w64 int>(_RanIt,_RanIt,_Fn1 &,_Diff *)' being compiled
1> with
1> [
1> _RanIt=random_stripes::Generator **,
1> _Fn1=int,
1> _Diff=__w64 int
1> ]
1> LoopGenerator.cpp(79) : see reference to function template instantiation 'void std::random_shuffle<std::_Vector_iterator<_Myvec>,int&>(_RanIt,_RanIt,_Fn1)' being compiled
1> with
1> [
1> _Myvec=std::_Vector_val<std::_Simple_types<random_stripes::Generator *>>,
1> _RanIt=std::_Vector_iterator<std::_Vector_val<std::_Simple_types<random_stripes::Generator *>>>,
1> _Fn1=int &
1> ]
这将我指向 2181
行在 <algorighm>
.我在那里看不到任何我能理解的东西。
那怎么了?打乱指针数组有问题吗?或者它们是抽象类指针有什么问题吗?
更多代码:
Generator.h
- 在 std::vector<Generator*> stripes
中的最高级别
namespace random_stripes {
class Generator
{
public:
Generator(int);
Generator();
virtual ~Generator() {};
//Returns next stripe and moves internal iterator
virtual RandomStripe next() = 0;
//Fills the variables with data AND ITERATES THE POINTER if third argument is true
virtual void getData(std::string&, int&, bool=true) = 0;
//Informs parent class/procedure whether all stripes were returned
virtual bool end() = 0;
//Reset the pointer (and anything else)
virtual void reset() = 0;
//Get/set the random seed
virtual int setSeed(int);
virtual int getSeed();
protected:
int seed;
};
}
LoopGenerator.h
namespace random_stripes {
class LoopGenerator : public ManyStripes
{
public:
LoopGenerator();
//True if shuffled
LoopGenerator(bool);
~LoopGenerator();
//If true, every LAP is shuffled (otherwise order is constant)
bool shuffled;
//OVERRIDEN METHODS
virtual RandomStripe next();
virtual void reset();
virtual bool end();
virtual void getData(std::string&, int&, bool=true);
//Properties
unsigned int repeat; //How many times should this sequence repeat
protected:
virtual int iterate();
unsigned int lap; //How many times DID this sequence repeat aready
void shuffle(); //Shuffle list of elements (defined in ManyStripes)
//Reset without forgeting lap
void makeLap();
};
}
最佳答案
那是因为你错误地调用了 random_shuffle
:
std::random_shuffle(stripes.begin(), stripes.end(), seed);
它不需要种子
,它需要一个函数:
template< class RandomIt, class RandomFunc >
void random_shuffle( RandomIt first, RandomIt last, RandomFunc& r );
RandomFunc
是一个函数,当使用 n
调用时,它应该返回 [0, n)
。它是 Knuth Shuffle 的一个实现.您可能打算调用:
srand(seed);
std::random_shuffle(stripes.begin(), stripes.end()); // typically uses rand()
或者,对于 C++11:
std::shuffle(stripes.begin(), stripes.end(), std::mt19937{seed});
关于c++ - 尝试随机播放 std::vector 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27348685/