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

标签 c++ vector artificial-intelligence

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

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 长度?我试过使用 vector.pushback 和 vector.resize 但两者都会给我错误,因为参数不匹配。其实我明白为什么它会变成错误,但我不知道如何匹配 vector 推回中的参数这是我的人口构造函数

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;
        }
    }
}

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

最佳答案

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()将在 vector 中的初始元素(在本例中为空指针)之后 添加元素.

关于C++ - 使用类参数定义 vector 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13450815/

相关文章:

OpenCV 存储点向量的向量 vector<vector<Point>>

search - RTS 视频游戏中的寻路是如何工作的?

machine-learning - 对于使用神经网络的二元分类,要使用多少个输出单元

artificial-intelligence - 留一交叉验证查询

C++内存对齐问题

c++ - 必须使用 'class' 标记来引用此范围内的类型 '____'

c++ - 如何在构造函数中初始化 vector 大小?

c++ - 当文本位于编辑控件中时,GetWindowTextLength 返回 0

c++ - std::atomic 和多核处理器

c++ - 如何/可能有一个 vector<unique_ptr<ABC>>?