Nik*_*ono 2 c++ artificial-intelligence vector
您好我正在尝试用C++创建一个遗传算法,我试图使用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);
};
Run Code Online (Sandbox Code Playgroud)
这是人口类,这里是染色体类
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();
};
Run Code Online (Sandbox Code Playgroud)
如何在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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您有任何其他信息,您可以在评论中告诉我,我会添加您需要的信息.谢谢你.
std::vector有几个构造函数,其中一个变体接受要存储在元素中的初始元素数vector.
指定的大小vector在population构造函数的初始化列表:
population::population(int numberOfPopulation) :
population_number(numberOfPopulation),
chromosome_population(numberOfPopulation)
{
}
Run Code Online (Sandbox Code Playgroud)
给出这种方法,population_number成员变量是不必要的,因为它可以通过获得chromosome_population.size().
指定初始大小vector意味着它包含numberOfPopulation空指针.在访问vector您需要创建对象的元素之前,在这种情况下使用new.如果元素是可复制的,并且不需要多态行为,那么建议使用vector<chromosome>.如果必须在vector当时使用动态分配的元素,则必须先分配:
chromosome_population[i] = new chromosome();
Run Code Online (Sandbox Code Playgroud)
记得delete不再需要的时候.
还希望使用一种形式的智能指针而不是原始指针.使用智能指针的一个优点是,当vector<unique_ptr<chromosome>>超出范围时,元素将被破坏,而不必显式调用delete每个元素.请参阅哪些C++智能指针实现可用?有用的智能指针列表.
请注意,vector::push_back()接受与其元素具有相同类型的参数.所以正确的调用push_back()是:
chromosome_population.push_back(new chromosome());
Run Code Online (Sandbox Code Playgroud)
如果指定vectorat构造的初始大小,则调用push_back()将在初始(在本例中为空指针)元素之后添加元素vector.