尝试重新调整std :: vector时出错

时间:2014-12-07 22:34:24

标签: c++ vector c++98

我有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;

GeneratorLoopGenerator虚拟超类。该向量应该允许包含和嵌套所有类型的随机生成器,我将其用于generating stripes。例如,生成5-50个细绿色条纹,然后生成厚棕色条纹:

random stripes forest theme

问题是我的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();
    };
}

1 个答案:

答案 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});