我有way to shuffle my std::vector
。具体来说,我使用C ++ 98方法:
void LoopGenerator::shuffle()
{
std::random_shuffle(stripes.begin(), stripes.end(), seed);
}
其中LoopGenerator
是一个以随机顺序抛出一些数据的类。向量stripes
以这种方式定义:
std::vector<Generator*> stripes;
Generator
是LoopGenerator
的虚拟超类。该向量应该允许包含和嵌套所有类型的随机生成器,我将其用于generating stripes。例如,生成5-50个细绿色条纹,然后生成厚棕色条纹:
问题是我的shuffle抛出错误:
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>
行。我在那里看不到任何我能理解的东西。
那有什么不对? shuffling 指针数组有问题吗?或者他们是抽象类指针?
有什么问题更多代码:
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();
};
}
答案 0 :(得分:1)
那是因为你没有错误地调用random_shuffle
:
std::random_shuffle(stripes.begin(), stripes.end(), seed);
它不需要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});