You might want to have/use variables/constants with the values (TILE_SIZE_W / 2.0f) and (TILE_SIZE_H / 2.0f) at least to simplify your code (in its code appearance as if thats a constant then the compiler should be simplifying it itself)
I would use a name like HALF_TILE_SIZE_W HALF_TILE_SIZE_H ...
Also once you determine it->isColliding = true; you keep looping and you should probably break out of the loop (or never enter the loop if its true at the if(it->CheckMapCollision()) test
you also seem to be running the same full collision testing twice (2 loops) doing the X Y vectors seperately when you aught to be able to combine them . It looks like are doing all the setup calc for each of the 2 it->Collide() twice.
As for minimizing the set of objects you need to test against that requires a spatial splitting method (if the obstacles are static, then there is less overhead than if you have to adjust the sets every time them would move)
If static a you could use a 2D supergrid array of nodes each with a membership list which you then test the moving 'it' object against only the supernode grid its in (or a small subset if your movement vector crosses more than one)
--------------------------------------------[size="1"]Ratings are Opinion, not Fact