Здравствуйте, я пытаюсь создать генетический алгоритм с C ++, и я пытался использовать вектор в качестве контейнера, проблема в том, что я не знал, как установить размер вектора, потому что у вектора есть аргумент класса, подобный этому
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();
};
Как я могу установить длину вектора в конструкторе класса населения? Я пытался использовать 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;
}
}
}
Если есть какая-либо другая информация, которую вы хотите, вы можете сообщить мне в комментарии, и я добавлю необходимую информацию. Спасибо, прежде чем.
std::vector
имеет несколько конструкторы и один из вариантов принимает начальное количество элементов, которые будут сохранены в 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
на каждом из элементов. Увидеть Какие реализации C ++ Smart Pointer доступны? для полезного списка доступных умных указателей.
Обратите внимание, что vector::push_back()
принимает аргумент того же типа, что и его элемент. Таким образом, правильный вызов push_back()
является:
chromosome_population.push_back(new chromosome());
Если вы укажете начальный размер vector
на стройке, звоню push_back()
добавит элементы после начальные (нулевые указатели в этом случае) элементы в vector
,
Других решений пока нет …