C ++ - 使用类参数定义Vector大小

时间:2012-11-19 09:24:20

标签: c++ vector artificial-intelligence

您好我正在尝试使用C ++创建遗传算法,我尝试使用vector作为容器,问题是我不知道如何设置向量的大小,因为向量有一个像这样的类参数< / p>

class population
{
    friend class chromosome;
private:
    int population_number;
    int best_index[2];
    vector <chromosome *> chromosome_population;
public:
    population(int numberOfPopulation);
    population(int numberOfPopulation,int numberOfSynapse);
    ~population();
    int worst_chromosome();
    void mating();
    void crossover(int parent_1,int parent_2);
};

这是人口类,这里是染色体类

class chromosome
{
    friend class population;
private:
    int chromosome_id;
    float fitness;
    vector <gen *> gen_chromosome;
public:
    chromosome();
    ~chromosome();
    void fitness_function();
    void mutation_translocation();
    int get_chromosome_size();
};

如何在population类构造函数中设置向量长度?我试过使用vector.pushback和vector.resize,但两者都会给我错误,因为参数不匹配。实际上我理解为什么它会变成错误但我不知道如何匹配矢量pushback中的参数这里是我的人口构造函数

population::population(int numberOfPopulation)
{
    srand (time(NULL));
    population_number = numberOfPopulation;
    for(int a=0;a<population_number;a++)
    {
        chromosome_population.push_back();
    }
    cout<<chromosome_population.size();
    for(int i=0;i<population_number;i++)
    {
        chromosome_population[i]->chromosome_id = i;
        int chromosome_length = rand() % 10 + 1;
        for(int j=0;j<chromosome_length;j++)
        {
            chromosome_population[i]->gen_chromosome[j]->basa_biner = rand()%1;
            chromosome_population[i]->fitness = (rand()%99)+1;
        }
    }
}

如果您有任何其他信息,您可以在评论中告诉我,我会添加您需要的信息。谢谢。

1 个答案:

答案 0 :(得分:6)

std::vector有多个constructors,其中一个变体接受要存储在vector中的初始元素数。

vector构造函数的初始值设定项列表中指定population的大小:

population::population(int numberOfPopulation) :
    population_number(numberOfPopulation),
    chromosome_population(numberOfPopulation)
{
}

采用这种方法,population_number成员变量是不必要的,因为它可以通过chromosome_population.size()获得。

vector上指定初始大小意味着它包含numberOfPopulation个空指针。在访问vector中的元素之前,您需要创建对象,在这种情况下使用new。如果元素是可复制的,并且不需要多态行为,那么建议使用vector<chromosome>代替。如果必须在vector中使用动态分配的元素,则必须先分配:

chromosome_population[i] = new chromosome();

并且在不再需要时记住delete

还希望使用一种智能指针而不是原始指针。使用智能指针的一个优点是,当vector<unique_ptr<chromosome>>超出范围时,元素将被破坏,而不必在每个元素上显式调用delete。有关可用智能指针的有用列表,请参阅What C++ Smart Pointer Implementations are available?

请注意vector::push_back()接受一个参数,其元素与其元素相同。因此push_back()的正确调用是:

chromosome_population.push_back(new chromosome());

如果您在构造时指定vector的初始大小,则调用push_back()将在<{em> 之后添加元素 {{em> 1}}。