c++ - 尝试随机播放 std::vector 时出错

标签 c++ vector c++98

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

GeneratorLoopGenerator虚拟父类(super class).该 vector 应该允许包含和嵌套各种随机生成器,我将其用于 generating stripes。 .例如,生成 5-50 条细绿色条纹,然后生成粗棕色条纹:

random stripes forest theme

问题是我的随机播放会抛出一个错误:

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/

相关文章:

C++/SDL : vector/surface issues

c++ - 使用反向迭代器从 vector 中快速删除

c++ - std::vector 作为 std::set 和 std::unordered_set 中的键

c++ - C++中对象数组的静态内存分配

c++ - 未知输入大小 cin

c++ - 片段着色器输出不受旋转影响

c++ - 初始化 bool 的内联 vector

c++ - 这段代码可以在我的 PC 上编译,但不能在竞赛服务器上的标准 C++98 编译器上编译

c++ - __Garbage__ 是 C++ 宏中的关键字吗?

c++ - 将数据放入 C++ 中的 std::vector 是否会创建数据的拷贝?