Определить размер вектора с аргументом класса

Здравствуйте, я пытаюсь создать генетический алгоритм с 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;
}
}
}

Если есть какая-либо другая информация, которую вы хотите, вы можете сообщить мне в комментарии, и я добавлю необходимую информацию. Спасибо, прежде чем.

2

Решение

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,

6

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector