The genius thing about Snake is, that you don't have to move all the blocks every time. It really doesn't matter whether block 4 remains block 4 or if it will be block 5 later on.
All you essentially need to care about when moving the snake is, removing the tail (last block), moving the head and adding a new element behind the head. All the in-between parts never need to move.
To change direction, you simply move the head in the given direction and add a new block where the head was before, it's very simple. But it's best to use a
std::deque so you can work on both ends.