Выдаёт неверные значения c++

115
08 августа 2021, 03:30

Имею подобный txt-файл . Для перенесения данных в два массива написал такой код:

vector<double> a;
vector<int> v;
double at;
int vt;
ifstream ff("var13.txt");
while (ff >> at >> vt)
{
    a.push_back(at);
    v.push_back(vt);
}

Однако мною было замечено, что если использовать для вывода цикл

for (auto i:a)
    cout << a[i] << "    " << v[i] << endl;

То на экран выведется такое содержимое:

14.078    10
14.078    10
13.29     7

и так далее, что является неверным.

В то же время, если использовать для вывода цикл

for(size_t i=0;i<a.size();i++)
   cout<< a[i] <<"    "<< v[i] <<endl;

То содержимое выведется верное. Не понятно, почему вывод получается неккоректным.

В своей программе я так же буду обращаться к элементам этих массивов, и теперь не понятно, могу ли я это делать переменными типа int, и придется ли их переводить в (size_t)

Прошу помощи в данном вопросе

Answer 1

Дело в том, что в:

for (auto i:a)
   cout << a[i] << "    " << v[i] << endl;    

в i записывается значение элементов вектора, и это равносильно, что написать:

for(size_t i=0;i<a.size();i++)
   cout<< a[a[i]] <<"    "<< v[a[i]] <<endl;

что наверняка не является вашим намерением, и вполне может привести к попытке вывода элемента за пределы вектора

Answer 2

Цикл for (auto i:a) перебирает значения из массива a. Соответственно i имеет тип double и последовательно принимает значения: 14,602 14,227 13,619 ... и так далее.

a[i] на первой итерации будет то же самое, что и a[14], то есть 14,078. Ну и так далее.

Рекомендую обращать внимание на warnings, наверняка там есть предупреждение, что в строке cout << a[i] << " " << v[i] << endl; имеется сужающее преобразование из double в int.

READ ALSO
jQuery find по массиву элементов

jQuery find по массиву элементов

Как правильно произвести поиск в массиве элементов?

176
Dokan запрашивает открытие папки как файла

Dokan запрашивает открытие папки как файла

У меня в файловой системе все данные хранятся в ОЗУЯ создал папку, в которую скопировал файл

267
Событие нажатия кнопок на блютуз гарнитуре C#

Событие нажатия кнопок на блютуз гарнитуре C#

Каким образом можно организовать отслеживание кнопок плей/пауза, громкость +/- блютуз гарнитуры? Заметил что в UWP приложениях отслеживание...

165
Создание отчёта в PDF и html [закрыт]

Создание отчёта в PDF и html [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме

216