C ++ vector инициализирует вектор агентов для генетического алгоритма - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть следующий код C ++, но я получаю некоторые ошибки, в основном такие как: следующий (после блока кода) агент - это просто класс, который я создал в отдельном файле

vector<Agent> population;
for (vector<int>::iterator i = population.begin(); i != population.end(); ++i) {
    population.push_back(new Agent(generateDna(targetString.size())));
}

Я получаю следующие ошибки

  1. нет подходящего пользовательского преобразования из "__gnu_cxx :: __ normal_iterator >>" в "__gnu_cxx :: __ normal_iterator >>" существует

2.no оператор "! =" Не соответствует этим операндам: типы операндов: __gnu_cxx :: __ normal_iterator >>! = __Gnu_cxx :: __ normal_iterator >>

3.не экземпляр перегруженной функции "std :: vector<_Tp, _Alloc> :: push_back [with _Tp = Agent, _Alloc = std :: allocator] "соответствует списку аргументов - типы аргументов: (Agent *) - тип объекта: std :: vector>

и я новичок в c ++, так что эти вещи могут быть самоочевидными, но я не знаю, что они означают.

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Ваша текущая проблема компиляции в том, что вы пытаетесь сохранить std::vector<Agent>::iterator в std::vector<int>::iterator. Это два совершенно разных типа.

Затем возникает проблема времени выполнения (после того, как вы фактически добавляете элементы в свой контейнер, потому что сейчас у вас их нет), ваши итераторы могут быть признаны недействительными после push_back, и у вас будет UB, потому что вы изменяете контейнер, пока вы Зацикливаемся.

Тогда возникает проблема, когда вы пытаетесь сохранить Agent* в векторе Agent.


Всего:

std::vector<Agent> population;

//fill your vector.. otherwise loop is useless because size is 0..
auto size = population.size();
for (unsigned int i = 0; i < size; ++i) {
    population.push_back(Agent(generateDna(targetString.size())));
}
0 голосов
/ 10 сентября 2018

Основная проблема заключается в том, что вы перебираете коллекцию, в которую вы добавляете данные в течение цикла, и даже через итератор, который определяется как int вместо Agent.Создайте новый вектор и вставьте сгенерированные значения в этот новый вектор.

Также помните об использовании нового ключевого слова.Вы должны освободить эту память позже.

Решение:

vector<Agent> population;
vector<Agent> newPopulation;
for (vector<Agent>::iterator i = population.begin(); i != population.end(); ++i) {
    newPopulation.push_back(Agent(generateDna(targetString.size())));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...