I know this is a little old now, but I had a similar query and T.C.'s "you'd need some library help" comment made me grin, because I ended up solving a similar issue with only a few extra characters. To recycle the OP's first example, and assuming as stated that the vectors are guaranteed the same size, you can make C++11 referencing meet old-school pointer arithmetic, like so:
std::vector<double> x;
std::vector<double> y;
for (double &xp:x)
{
std::cout << xp << y[&xp-&x[0]] << std::endl;
}
Probably best not used in production code (I'm a self-taught hobbyist coder, so meh) but it works well enough, is simple, requires no libraries and does not seem to suffer any notable speed penalty (at least, that I've noticed). It even works in minimal C++11 environments (such as VC11). To be clear, I used this in a slightly different context, where (given the above example) I only accessed y[] when a change was actually required (so any possible speed reduction is mitigated in the noise), but since the y[] access was required at the same index as in x[] and required no extra variables/iterators, it fit the bill perfectly.
Also, +1 for manlio's answer; would you believe I actually tried to use exactly that syntax intuitively before I went looking for an alternative? :O