在向量中使用sort()比较两个对象变量

时间:2016-10-13 04:16:12

标签: c++ pointers object vector

我一直在反对这个和谷歌一段时间,所以我希望可以问。我仍在学习C ++并享受它,但我还没有完全理解所有内容,而且我现在正在挖掘我的Data Structures类中的指针和类。为什么我不能使用这种方法比较树对象的适应度变量?

我收到错误:'环境::比较':非标准语法;使用'&'创建指向成员的指针。

void Environment::evolve(const int popsize,const int maxgen) {
    std::cout << "> evolving function" << std::endl;

    std::vector<Tree> popvec;

    // Generate initial pop trees and store in array
    for (int i = 0; i <= popsize - 1; i++) {
        std::cout << "> generating initial population" << std::endl;

        Tree membertree;
        popvec.push_back(membertree);
    }

    // Loop for generations
    for (int j = 1; j <= maxgen; j++) {
        std::cout << "Generation " << j << ":" << std::endl;

        // sort array by fitness
        std::sort(popvec.begin(), popvec.end(), compare);

        // cull herd

        // reproduce

    }
}

bool Environment::compare(Tree obj1, Tree obj2) {
    return (obj1.fitness < obj2.fitness);
}

感谢您的帮助。

使用标题编辑:

#include "Tree.h"

class Environment {
public:
    Environment();
    ~Environment();
    void evolve(const int popsize,const int maxgen);
    bool compare(Tree obj1, Tree obj2);

private:
    Tree* poparray;
};

2 个答案:

答案 0 :(得分:0)

编译错误的直接原因

std::sort(popvec.begin(), popvec.end(), compare);

您正在引用compare,这是一个类成员函数。要传递指向类成员(数据或函数)的指针,您需要使用&Class::Member语法:

std::sort(popvec.begin(), popvec.end(), &Environment::compare);

但除非compare是一个静态函数,否则这不会起作用 - 因为它应该是(或者你可以通过传递一个有状态的lambda / functor做体操,但没有理由一个理智的人会这样做)。

真正的问题

您应该更改compare的声明 - 将其设为static成员函数:

static bool compare(Tree obj1, Tree obj2);

如果您这样做,则不再需要更改sort调用语法(尽管仍然有效)

答案 1 :(得分:0)

您必须将Environment::compare声明为static,例如:

class Environment {
    ...
    static bool compare (Tree obj1, Tree obj2);
    ...
};