Devo iterar um vetor por iterador ou por operador de acesso?

Eu tenho um vetor declarado como

std::vector<int> MyVector;
MyVector.push_back(5);
MyVector.push_back(6);
MyVector.push_back(7);

Como devo usá-lo em um loop for?

Por iterar com um iterador?

for (std::vector<int>::iterator it=MyVector.begin(); it!=MyVector.end(); ++it)
{
    std::cout << "Vector element (*it): " << *it << std::endl;
}

Ou pelo seu iterador de acesso?

for (std::vector<int>::size_type i=0; i<MyVector.size(); i++)
{
    std::cout << "Vector element  (i) : " << MyVector.at(i) << std::endl;
}

Nos exemplos que encontrei na internet, ambos são usados. Um deles é superior ao outro sob todas as condições? Se não, quando devo preferir um deles ao outro?

questionAnswers(4)

yourAnswerToTheQuestion