I use "actors" to represent game items and monsters. You can think of it as a base object class for things that have specific locations in the game world. There's a global table of actors that has all the actual data in it. I look up an actor in that table using its ID number. The dungeon map is a structure keyed by location, where I look up ID numbers. So, when I need to know what's on tile XYZ, I query the dungeon map to get its ID, then query the actor table to get its data.
One complication is that when an actor is being carried, or in a container, its "location" is the actor that contains it or carries it, not a map location. So this means that when I want to know everything on square XYZ, and I get back a creature!actor or container!actor, I then have to query the actor data itself to get back a list of other actors it's containing/carrying.
So if the actor on square XYZ is an ogre, I re-query to get a list of what the ogre's carrying. If one of the things the ogre is carrying is a sack, I re-query to get a list of what's in the sack. If one of the items in the sack is a box, I re-query to get a list of what's in the box ... and eventually I have a complete list of every actor on that tile.
I decided that it was worth it to put the actor coordinates into the actor data. It duplicates information, but it makes it possible to query an actor and get its current location, or query a location and get the actor/s on it, without iterating. An actor's location, in its own data, is either the coordinates of a tile, or a reference to a containing or carrying actor. It means every time an actor moves (or is contained/carried or uncontained/released) both the actor data and the map have to be updated. But I have to touch that in a very few routines, and elsewhere I just call those routines, so I never have to worry about it.
There is never a need to iterate over all actors. At most, I iterate over the actors in a specific area to apply damage when there's an area-effect attack, which I handle as an iteration over map locations. I guess you're iterating over creature!actors to apply time ticks to them. I have the schedule as another structure, not too unlike the map, except that instead of querying tile XYZ and getting a list of actor IDs, the schedule allows me to query time XYZ (an integer turn number) and get a list of events that take place during that turn (with real-number absolute times). Some of these events are monster's turns. Others are time-keyed events like healing, poison damage, etc. Any event that needs the ID of an actor has it as part of its data, so I go straight to the actor when it's that actor's turn, rather than finding it in an iteration over all actors most of whose turn it isn't.
Bear