优化这段代码 auto Agvs = this->getAgvs(); int agvNumber = 0; int allEnergy = 0; for (auto &agv : Agvs) { auto agvState = agv->getState(); if (agvState != AgvState::Offline) { auto agvEnergy = agv->getEnergy(); allEnergy =allEnergy + agvEnergy; agvNumber = agvNumber + 1; } } if (agvNumber != 0) { double num = allEnergy / agvNumber; QString m_averageEnergy = QString::number(num,'f',2); return m_averageEnergy; } else { return 0; }
时间: 2024-03-27 10:39:44 浏览: 127
可以尝试使用 STL 中的算法来优化代码。可以使用 std::accumulate 算法来计算 Agv 的总能量和数量,使用 std::count_if 算法来计算在线 Agv 的数量。这样可以减少循环次数,提高代码效率。下面是优化后的代码:
```
auto Agvs = this->getAgvs();
int allEnergy = std::accumulate(Agvs.begin(), Agvs.end(), 0, [](int sum, const auto& agv) {
if (agv->getState() != AgvState::Offline) {
return sum + agv->getEnergy();
}
return sum;
});
int agvNumber = std::count_if(Agvs.begin(), Agvs.end(), [](const auto& agv) {
return agv->getState() != AgvState::Offline;
});
if (agvNumber != 0) {
double num = static_cast<double>(allEnergy) / agvNumber;
QString m_averageEnergy = QString::number(num, 'f', 2);
return m_averageEnergy;
} else {
return "0";
}
```
相关问题
优化这段代码 auto Agvs = this->getAgvs(); int agvNumber = Agvs.size(); float count = 0; for (auto &agv : Agvs) { auto agvState = agv->getState(); if (agvState == AgvState::Task) { count = count + 1.00; } if (agvState == AgvState::Offline) { agvNumber = agvNumber - 1; } } if (agvNumber != 0.0) { double num = count / agvNumber; double agvIdle = (1.00 - num) * 100; QString agvIdleRate = QString::number(agvIdle, 'f', 2) + "%"; return agvIdleRate; } else { return 0; }
优化后的代码如下:
const auto& Agvs = this->getAgvs();
const int agvNumber = Agvs.size();
float count = 0;
for (const auto& agv : Agvs) {
if (agv->getState() == AgvState::Task) {
++count;
} else if (agv->getState() == AgvState::Offline) {
--agvNumber;
}
}
if (agvNumber != 0) {
const double agvIdle = (1.0 - count / agvNumber) * 100.0;
return QString::number(agvIdle, 'f', 2) + "%";
} else {
return "0";
}
优化建议:
1. 使用常量引用代替拷贝,减少不必要的开销。
2. 使用前置自增运算符代替后置自增运算符,可以提高效率。
3. 使用else if代替嵌套if语句,使代码更加简洁。
4. 使用常量代替魔法数,提高代码可读性和可维护性。
5. 将计算空闲率的代码放到if语句中,避免了不必要的计算。
优化这段代码并添加注释 auto Agvs = this->getAgvs(); int agvNumber = Agvs.size(); float count = 0; for (auto &agv : Agvs) { auto agvState = agv->getState(); if (agvState == AgvState::Task) { count = count + 1.00; } if (agvState == AgvState::Offline) { agvNumber = agvNumber - 1; } } if (agvNumber != 0.0) { double num = count / agvNumber; double agvIdle = (1.00 - num) * 100; QString agvIdleRate = QString::number(agvIdle, 'f', 2) + "%"; return agvIdleRate; } else { return 0; }
// 获取所有AGV列表
auto Agvs = this->getAgvs();
// 获取AGV数量
int agvNumber = Agvs.size();
// 记录AGV空闲率
float count = 0;
// 遍历AGV列表
for (auto &agv : Agvs) {
// 获取当前AGV的状态
auto agvState = agv->getState();
// 如果AGV正在执行任务,增加空闲率计数器
if (agvState == AgvState::Task) {
count = count + 1.00;
}
// 如果AGV处于离线状态,减少AGV数量计数器
if (agvState == AgvState::Offline) {
agvNumber = agvNumber - 1;
}
}
// 如果AGV数量不为0,计算空闲率并返回
if (agvNumber != 0.0) {
double num = count / agvNumber;
double agvIdle = (1.00 - num) * 100;
QString agvIdleRate = QString::number(agvIdle, 'f', 2) + "%";
return agvIdleRate;
}
// 如果AGV数量为0,返回0
else {
return 0;
}
优化建议:
1. 可以使用auto关键字代替类型声明,使代码更简洁易读。
2. 可以使用range-based for循环代替传统的for循环,使代码更加简洁易读。
3. 可以使用三目运算符代替if-else语句,使代码更加简洁。
4. 可以使用常量代替魔法数,使代码更加易读易维护。
阅读全文