I am building a simulation where you have 'Agents' distributed over a rather large landscape. Because the number of Agents is small, compared to the size of the landscape, I use the PIC approach where the landscape is divided into rather large cells and every cell can contain multiple agents - in contrast to a classical grid based approach. This should speed up spatial analysis.I am asking whether there is a way to improve the code I came up with:Agents contain an iterator to the node in the cell and a ptr to the cell containing the nodeclass Agent;typedef std::list <Agent*> CELL;class Agent {  public:  //...stuff...    CELL::iterator cell_iter;    CELL*cell_ptr;};class Grid {  public:    Grid(int dimx,int dimy,int cellsize);    CELL *GetCell(double x,double y);  private:    std::vector <std::vector<CELL>> grid_;    int dimx_,dimy_,cellsize_,ncellx_,ncelly_;  };To add a new individual:std::list <Agent> population;//..stuff...Agent seed(pos_x,pos_y,seed_type,10.1); // create a local agentpopulation.push_back(std::move(seed));Agent *agent=&population.back()CELL *cell=GetCell(agent->x_,agent->y_); // get the cell for the agents poscell->push_back(agent); // add the agents ptr to the cellagent->cell_ptr=cell; // save the agents cell to the agentagent->cell_iter=--cell->end(); // save an iterator to the actual nodeTo delete an individualauto iter=population.begin();//...stuff...(*iter).cell_ptr->erase((*iter).cell_iter); // erase the ptr to the agent from the celliter=population.erase(iter);    
Particle in Cell: efficient data structure handling
c++;c++11;simulation
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->erase((*iter).cell_iter); // erase the ptr to the agent from the cellstd::swap(*iter, population.back());population.pop_back();//doesn't invalidate iter