Значение переменной d в цикле на основе диапазона для
for (auto d : datos)
std::cout << datos[d] << ' ';
не является индексом в векторе. Это значение текущего элемента вектора
Просто используйте
for (auto d : datos)
std::cout << d << ' ';
Для этого вектора
std::vector<double> datos = {1, 1, 2, 3, 4, 5};
вы получили ожидаемый результат, потому что
datos[datos[1]]
равно 1, то есть он равен этому элементу
std::vector<double> datos = {1, 1, 2, 3, 4, 5};
^^^
datos[datos[1]]
снова дает тот же элемент.
datos[datos[2]]
равен 2 и т. Д. on.
Если вы, например, измените вектор, например
std::vector<double> datos = { 5 };
, то у вас будет неопределенное поведение, потому что datos[datos[2]]
пытается получить доступ к памяти за пределами выделенной памяти для элементов вектора.
Без углубления в детали этот цикл
for (auto d : datos)
std::cout << d << ' ';
фактически эквивалентен следующему
for ( auto first = std::begin( datos ); first != std::end( datos ); ++first )
{
auto d = *first;
std::cout << d << ' ';
}