Iterating through 62500 objects shouldn't be a problem.
Should I set collision chechks only if objects are close to player?
Only if you update objects close to the player, otherwise weird things might happen. Only check collisions with objects that are close to each other.
You could for example divide the board using an imaginary grid. Add objects to cells that they are inside of. Then while doing a collision check, only check collisions with objects in the same cell. Do keep your current vector as well, for keeping updating, rendering and deletion simple.
You can keep track of objects that can collide and objects that can't in 2 seperate vectors. You'll get rid of the if (foo->Collidable()) check completely or almost completely, which can improve performance a lot if your program is suffering from many branch mispredictions.
All those virtual calls and dereferencing pointers, pointing to objects made by new that might be located all over the place (causing cache misses), might be a problem.
Perhaps try a design like this, this is assuming snow is a very common object, expected to be on the screen in great quantities. If it isn't, don't bother with the following code, but do keep it in mind.
3 float x, y;
6class SnowParticleSystem : public GameObject
8 // std::array is C++11, if you're on an older compiler use an alternative
9 std::array<SnowParticle, 255> snowParticleArray; // 255 Snow particles max
11 // On older compilers, omit the override keyword
12 void Update() override
14 for (auto it : snowParticleArray)
16 // update snow
19 // Same for rendering