std::priority_queue<> is pretty easy to use; std::map<> is trivial to use. Both will perform very well.
I comprehend your priority_queue suggestion (thanks for the usage example, btw - I've never used priority queues before), but how/why would one use std::map (or related) in this situation?
Would you map the tick they fire on?
std::unordered_multimap<Tick, Action> timers;
timers.insert(std::make_pair<Tick, Action>(timeToTrigger, actionToTrigger));
//...
auto rangePair = timers.equal_range(currentTick);
for(auto it = rangePair.first; it != rangePair.second; ++it)
{
it->second->timer_expired();
}
Or what?