Most of the time, both are about equally bad practice.
What you should normally try to do is figure out what the loop accomplishes, and either use an existing algorithm or else write a new algorithm to accomplish that end generically, then apply that algorithm to the collection/range at hand.
Just for example, let's assume you were adding up the items in a vector:
int total = 0;
for (int i=0; i<v.size(); i++)
total += v[i];
std::cout << "Total = " << total << "\n";
Rewriting this to use iterators is essentially no improvement (and arguably detrimental):
int total = 0;
for (std::vector<int>::iterator p = v.begin(); p!= v.end(); ++p)
total += *p;
std::cout << "Total = " << total << "\n";
Using C++11, you can at least restore a little sanity:
int total = 0;
for (auto p : v)
total += p;
std:cout << "Total = " << total << "\n";
...but you don't even need C++11 to to the job quite a bit better still:
std::cout << "Total = "
<< std::accumulate(v.begin(), v.end(), 0)
<< "\n";
When you find yourself thinking about writing a loop, changing the loop to use an iterator is rarely the right answer -- the right answer is usually to eliminate the loop and replace it with an algorithm instead.