C++ 向量初始化遗传算法的代理向量

C++ vector initialise a vector of agents for a genetic algorithm

我有以下 C++ 代码,但我主要在以下内容中遇到一些错误(在代码块之后)代理只是我在单独文件中创建的 class

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

我收到以下错误

  1. no suitable user-defined conversion from "__gnu_cxx::__normal_iterator>>" to "__gnu_cxx::__normal_iterator>>" exists

2.no operator "!=" matches these operands -- operand types are: __gnu_cxx::__normal_iterator>> != __gnu_cxx::__normal_iterator>>

3.no instance of overloaded function "std::vector<_Tp, _Alloc>::push_back [with _Tp=Agent, _Alloc=std::allocator]" matches the argument list -- argument types are: (Agent *) -- object type is: std::vector>

我是 c++ 的新手,所以这些东西可能不言自明,但我不知道它们是什么意思。

主要问题是您正在遍历在循环中追加的集合,甚至是通过定义为 int 而不是 Agent 的迭代器。创建新向量并将生成的值推送到这个新向量中。

还要注意使用 new 关键字。您必须稍后释放该内存。

解决方案:

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

您当前的编译问题是您试图将 std::vector<Agent>::iterator 存储到 std::vector<int>::iterator 中。这是两种完全不同的类型。

然后是你的运行时问题(在你实际添加元素到你的容器之后,因为现在你有 none),你的迭代器可能在 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())));
}