导图社区 TMap的循环遍历
UEC 中TMap的循环遍历(主要是涉及修改原值),包含代码示例、 问题分析、 修改办法等。
编辑于2024-02-01 10:23:17TMap的循环遍历
代码示例
TMap<FVerticalCurveInfo, FVerticalCurveDatas> UVerticalCurveAlgorithm::Calculate_VerticalCurveDataMap_StartEnd( UPARAM(ref) TMap<FVerticalCurveInfo, FVerticalCurveDatas>& InVerticalCurve) { for (auto VerticalCurve : InVerticalCurve) { for (int32 i = 0; i < VerticalCurve.Value.Datas.Num(); ++i) { if (VerticalCurve.Value.Datas[i].PointTangencyType == EPointTangencyType::PointTangency) { VerticalCurve.Value.Datas[i].Elevation_Start = VerticalCurve.Value.Datas[i].Elevation_PointTangency - VerticalCurve.Value.Datas[i].T * VerticalCurve.Value.Datas[i].Grade; VerticalCurve.Value.Datas[i].Elevation_End = VerticalCurve.Value.Datas[i].Elevation_PointTangency + VerticalCurve.Value.Datas[i].T * VerticalCurve.Value.Datas[i + 1].Grade; } } } return InVerticalCurve; }
问题分析
在这段代码中,它的意图是修改引用传递进来的参数的某些值。但是代码执行结果是修改失败。
问题出在for (auto VerticalCurve : InVerticalCurve)这个循环上。在这个循环中,VerticalCurve是一个复制出来的元素,而不是原始InVerticalCurve中的元素的引用。因此,对VerticalCurve的修改不会影响到原始InVerticalCurve中的元素。
为了实现修改引用传递进来的参数,可以使用范围基于引用的循环,或者使用迭代器。
修改办法
使用基于引用的循环
TMap<FVerticalCurveInfo, FVerticalCurveDatas> UVerticalCurveAlgorithm::Calculate_VerticalCurveDataMap_StartEnd( UPARAM(ref) TMap<FVerticalCurveInfo, FVerticalCurveDatas>& InVerticalCurve) { for (auto& VerticalCurve : InVerticalCurve) { for (int32 i = 0; i < VerticalCurve.Value.Datas.Num(); ++i) { if (VerticalCurve.Value.Datas[i].PointTangencyType == EPointTangencyType::PointTangency) { VerticalCurve.Value.Datas[i].Elevation_Start = VerticalCurve.Value.Datas[i].Elevation_PointTangency - VerticalCurve.Value.Datas[i].T * VerticalCurve.Value.Datas[i].Grade; VerticalCurve.Value.Datas[i].Elevation_End = VerticalCurve.Value.Datas[i].Elevation_PointTangency + VerticalCurve.Value.Datas[i].T * VerticalCurve.Value.Datas[i + 1].Grade; } } } return InVerticalCurve; }
这里使用auto&来确保VerticalCurve是原始InVerticalCurve中的元素的引用。而不是复制出来的值,通过这样的方式,对VerticalCurve的修改会影响原始InVerticalCurve。
使用迭代器
TMap<FVerticalCurveInfo, FVerticalCurveDatas> UVerticalCurveAlgorithm::Calculate_VerticalCurveDataMap_StartEnd( UPARAM(ref) TMap<FVerticalCurveInfo, FVerticalCurveDatas>& InVerticalCurve) { for (auto It = InVerticalCurve.CreateIterator(); It; ++It) { for (int32 i = 0; i < It.Value().Datas.Num(); ++i) { if (It.Value().Datas[i].PointTangencyType == EPointTangencyType::PointTangency) { It.Value().Datas[i].Elevation_Start = It.Value().Datas[i].Elevation_PointTangency - It.Value().Datas[i].T * It.Value().Datas[i].Grade; It.Value().Datas[i].Elevation_End = It.Value().Datas[i].Elevation_PointTangency + It.Value().Datas[i].T * It.Value().Datas[i + 1].Grade; } } } return InVerticalCurve; }
这这个修改的示例中,使用了CreateIterator()来获取TMap的迭代器,然后再循环中使用It访问元素。通过这种方式,我们可以直接修改It.Value(),从而修改原始的InVerticalCurve