I find myself writing code that looks like this a lot:
set<int> affected_items; while (string code = GetKeyCodeFromSomewhere()) { if (code == 'some constant' || code == 'some other constant') { affected_items.insert(some_constant_id); } else if (code == 'yet another constant' || code == 'the constant I didn't mention yet') { affected_items.insert(some_other_constant_id); } // else if etc... } for (set<int>::iterator it = affected_items.begin(); it != affected_items.end(); it++) { switch(*it) { case some_constant_id: RunSomeFunction(with, these, params); break; case some_other_constant_id: RunSomeOtherFunction(with, these, other, params); break; // etc... } }
The reason I end up writing this code is that I need to only run the functions in the second loop once even if I’ve received multiple key codes that might cause them to run.
This just doesn’t seem like the best way to do it. Is there a neater way?
Since you don’t seem to care about the actual values in the set you could replace it with setting bits in an int. You can also replace the linear time search logic with log time search logic. Here’s the final code: