Particle in Cell: efficient data structure handling
If you have move push_back then you should also have emplace_back. 

population.emplace_back(pos_x,pos_y,seed_type,10.1);


Erasing the individual means moving everyone that comes after. If you don't care about order then do a swap with back:

auto iter=population.begin();
//...stuff...
(*iter).cell_ptr-&gt;erase((*iter).cell_iter); // erase the ptr to the agent from the cell
std::swap(*iter, population.back());
population.pop_back();
//doesn't invalidate iter