转换包含向量 C++ 的语法和结构
transform syntax and structures containing vectors c++
我对函数std::transform
的语法有问题。因此,我有一个包含有关机场信息的结构AirportInfo
。然后,每个结构都排列在字典中,以便它们具有唯一的ID。在结构中有一个对向量m_routes
其中包含目的地机场的 ID 以及航班是否直达。 (在这种情况下,只考虑直飞航班,因为所有非直飞航班都已删除,因此对的第二项将始终为 0(。该函数calculateDistanceBetween
通过了解它们的坐标来返回 2 个机场之间的距离,这些坐标也存储在pos
的结构中。现在我必须计算每条路线的距离,但我无法克服语法:(任何帮助将不胜感激,谢谢!
这段代码有效
// Calculates the distance between two points on earth specified by longitude/latitude.
// Function taken and adapted from http://www.codeproject.com/Articles/22488/Distance-using-Longitiude-and-latitude-using-c
float calculateDistanceBetween(float lat1, float long1, float lat2, float long2)
{
// main code inside the class
float dlat1 = lat1 * ((float)M_PI / 180.0f);
float dlong1 = long1 * ((float)M_PI / 180.0f);
float dlat2 = lat2 * ((float)M_PI / 180.0f);
float dlong2 = long2 * ((float)M_PI / 180.0f);
float dLong = dlong1 - dlong2;
float dLat = dlat1 - dlat2;
float aHarv = pow(sin(dLat / 2.0f), 2.0f) + cos(dlat1) * cos(dlat2) * pow(sin(dLong / 2), 2);
float cHarv = 2 * atan2(sqrt(aHarv), sqrt(1.0f - aHarv));
// earth's radius from wikipedia varies between 6,356.750 km and 6,378.135 km
// The IUGG value for the equatorial radius of the Earth is 6378.137 km
const float earth = 6378.137f;
return earth * cHarv;
}
struct AirportInfo
{
std::string m_name;
std::string m_city;
std::string m_country;
float pos[2]; // x: latitude, y: longitude
std::vector<std::pair<int, int>> m_routes; // dest_id + numStops
std::vector<float> m_routeLengths;
float m_averageRouteLength;
};
以下是导致麻烦的原因:
//- For each route in AirportInfo::m_routes, calculate the distance between start and destination. Store the results in AirportInfo::m_routeLengths. Use std::transform() and calculateDistanceBetween().
void calculateDistancePerRoute(std::map<int, AirportInfo>& airportInfo)
{ //loop all structures
for(int i = 0; i < airportInfo.size(); i++ ){
// START END SAVE
std::transform(airportInfo[i].pos[0], airportInfo[i].pos[1], /*...*/ , airportInfo[i].m_routeLengths.begin(),
calculateDistanceBetween);
}
std::cout << "Calculate distance for each route" << std::endl;
}
使用std::back_inserter(airportInfo[i].m_routeLengths)
(如果性能很重要,请提前保留向量大小(,而不是airportInfo[i].m_routeLengths.begin()
。此外,当没有任何"强制"说明映射中的猥亵来自0...map.size()
是不安全的时,按索引迭代是不安全的,您应该更喜欢在所示用例中使用向量。
我认为这就像你想要的:
void calculateDistancePerRoute(std::map<int, AirportInfo>& airportInfo)
{
for(int i = 0; i < airportInfo.size(); i++ )
{
float currentPosX = airportInfo.at(i).pos[0];
float currentPosY = airportInfo.at(i).pos[1];
std::transform(airportInfo.begin(), airportInfo.end(), std::back_inserter(airportInfo.at(i).m_routeLengths), [&] (const auto& otherAirport)
{
return calculateDistanceBetween(currentPosX, currentPosY, otherAirport.second.pos[0], otherAirport.second.pos[1]);
});
}
}
Godbolt 中的示例
相关文章:
- 将信息输入到下面显示的结构向量中的正确语法/格式是什么
- 转换包含向量 C++ 的语法和结构
- C++-用和结构相同的语法围绕结构构造包装类
- 当C++类函数参数之一是结构时,它们的语法有什么不同
- 错误 C2059:语法错误:从结构成员声明'constant'
- Boost.Spirit.Qi 语法,用于 Boost.Fusion 自适应结构中的默认值
- 结构化绑定语法是否可以在多态 lambda 中使用
- 我想重置一个C++结构统计,我可以以某种方式使用 stat() 语法吗?
- 结构初始化语法
- 返回结构的方法的正确语法是什么
- boost :: Spirit :: Karma语法:逗号从结构上划定了带有选件属性的输出
- 在语法树中的节点上定义的层次结构的表达式模板
- C :将结构传递到函数,无法理解语法
- C Koala图库 - 了解访问数据结构的语法
- 无法理解此C++表达式的语法/结构
- Visual C++ 模板类成员结构初始化语法糖
- C++中的抽象语法树:类与结构
- 模板类中新结构的C++语法
- boost :: Spirit :: Qi-与语法结构中的实例成员一起工作
- 解析c++的语法结构是否比其他语言更难?