Галерея диаграмм связей Обход цикла TMap
Циклический обход TMap в UEC (в основном включает в себя изменение исходного значения), включая примеры кода, анализ проблемы, Методы модификации и т.д.
Отредактировано в 2024-02-01 10:23:17Обход цикла TMap
пример кода
TMap<FVerticalCurveInfo, FVerticalCurveDatas> UVerticalCurveAlgorithm::Calculate_VerticalCurveDataMap_StartEnd( UPARAM (ссылка) TMap<FVerticalCurveInfo, FVerticalCurveDatas>& InVerticalCurve) { for (автовертикальная кривая: InVerticalCurve) { for (int32 i = 0; i <VerticalCurve.Value.Datas.Num(); i) { if (VerticalCurve.Value.Datas[i].PointTangencyType == EPointTangencyType::PointTangencyType) { ВертикальнаяКривая.Значение.Данные[i].Elevation_Start = ВертикальнаяКривая.Значение.Данные[i].Elevation_PointTangency - ВертикальнаяКривая.Значение.Данные[i].T * ВертикальнаяКривая.Значение.Данные[i].Grade; ВертикальнаяКривая.Значение.Данные[i].Elevation_End = ВертикальнаяКривая.Значение.Данные[i].Elevation_PointTangency ВертикальнаяКривая.Значение.Данные[i].T * ВертикальнаяКривая.Значение.Данные[i 1].Grade; } } } вернуть InVerticalCurve; }
анализ проблемы
Целью этого кода является изменение некоторого значения параметра, переданного по ссылке. Однако в результате выполнения кода модификация завершается неудачно.
Проблема заключается в цикле for (auto UpperticalCurve : InVerticalCurve). В этом цикле UpperCurve является скопированным элементом, а не ссылкой на элемент в исходном InVerticalCurve. Таким образом, изменения в UpperticalCurve не повлияют на элементы исходного InVerticalCurve.
Чтобы изменить параметры, передаваемые по ссылке, вы можете использовать ссылочный цикл на основе диапазона или использовать итератор.
Метод модификации
Используйте циклы на основе ссылок
TMap<FVerticalCurveInfo, FVerticalCurveDatas> UVerticalCurveAlgorithm::Calculate_VerticalCurveDataMap_StartEnd( UPARAM (ссылка) TMap<FVerticalCurveInfo, FVerticalCurveDatas>& InVerticalCurve) { для (авто и Вертикальная кривая: InVerticalCurve) { for (int32 i = 0; i <VerticalCurve.Value.Datas.Num(); i) { if (VerticalCurve.Value.Datas[i].PointTangencyType == EPointTangencyType::PointTangencyType) { ВертикальнаяКривая.Значение.Данные[i].Elevation_Start = ВертикальнаяКривая.Значение.Данные[i].Elevation_PointTangency - ВертикальнаяКривая.Значение.Данные[i].T * ВертикальнаяКривая.Значение.Данные[i].Grade; ВертикальнаяКривая.Значение.Данные[i].Elevation_End = ВертикальнаяКривая.Значение.Данные[i].Elevation_PointTangency ВертикальнаяКривая.Значение.Данные[i].T * ВертикальнаяКривая.Значение.Данные[i 1].Grade; } } } вернуть InVerticalCurve; }
Здесь используется Auto&, чтобы гарантировать, что UpperCurve является ссылкой на элемент в исходном InVerticalCurve. Таким образом, вместо копирования значения изменения в UpperticalCurve повлияют на исходную InVerticalCurve.
Использовать итератор
TMap<FVerticalCurveInfo, FVerticalCurveDatas> UVerticalCurveAlgorithm::Calculate_VerticalCurveDataMap_StartEnd( UPARAM (ссылка) TMap<FVerticalCurveInfo, FVerticalCurveDatas>& InVerticalCurve) { для (авто It = InVerticalCurve.CreateIterator(); It; It) { for (int32 i = 0; i < It.Value().Datas.Num(); i) { if (It.Value().Datas[i].PointTangencyType == EPointTangencyType::PointTangencyType) { It.Value().Datas[i].Elevation_Start = It.Value().Datas[i].Elevation_PointTangency - It.Value().Datas[i].T * It.Value().Datas[i]. Оценка; It.Value().Datas[i].Elevation_End = It.Value().Datas[i].Elevation_PointTangency It.Value().Datas[i].T * It.Value().Datas[i 1]. Оценка; } } } вернуть InVerticalCurve; }
В этом модифицированном примере CreateIterator() используется для получения итератора TMap, а затем используется в цикле для доступа к элементам. Таким образом, мы можем напрямую изменить It.Value() и, следовательно, исходную InVerticalCurve.