优化下列代码实处每个实验室的状态#include <iostream> #include <map> #include "ComputerLab.h" int main() { std::map<int, ComputerLab> labs = { {1, ComputerLab(1, 1, 5)}, {2, ComputerLab(2, 1, 6)}, {3, ComputerLab(3, 1, 4)}, {4, ComputerLab(4, 1, 3)} }; std::string userId; int labNum, stationNum; char action; while (std::cin >> userId >> labNum) { if (userId == "=") { break; } if (labNum < 1 || labNum > 4) { std::cerr << "Invalid lab number!\n"; continue; } if (std::cin >> stationNum) { try { auto& lab = labs.at(labNum); if (action == '+') { lab.addStationUser(userId, stationNum); } else if (action == '-') { lab.removeStationUser(stationNum); } } catch (const std::out_of_range& e) { std::cerr << e.what() << std::endl; } catch (const std::invalid_argument& e) { std::cerr << e.what() << std::endl; } } else { std::cerr << "Invalid input format!\n"; } std::cin >> action; } for (const auto& [labNum, lab] : labs) { std::cout << lab; } return 0; }
时间: 2023-12-10 16:39:06 浏览: 150
#include_iostream.h_
4星 · 用户满意度95%
以下是优化后的代码:
```cpp
#include <iostream>
#include <unordered_map>
#include "ComputerLab.h"
int main() {
std::unordered_map<int, ComputerLab> labs = {
{1, ComputerLab(1, 1, 5)},
{2, ComputerLab(2, 1, 6)},
{3, ComputerLab(3, 1, 4)},
{4, ComputerLab(4, 1, 3)}
};
std::string userId;
int labNum, stationNum;
char action;
while (std::cin >> userId >> labNum >> stationNum >> action) {
if (userId == "=") {
break;
}
auto lab_it = labs.find(labNum);
if (lab_it == labs.end()) {
std::cerr << "Invalid lab number!\n";
continue;
}
auto& lab = lab_it->second;
if (action == '+') {
lab.addStationUser(userId, stationNum);
} else if (action == '-') {
lab.removeStationUser(stationNum);
} else {
std::cerr << "Invalid input format!\n";
}
}
for (const auto& [labNum, lab] : labs) {
std::cout << lab;
}
return 0;
}
```
这个版本的代码主要做了以下优化:
1. 使用 `std::unordered_map` 代替 `std::map`,因为 `std::unordered_map` 的查找和插入操作平均时间复杂度为 O(1),而 `std::map` 的时间复杂度为 O(log n)。
2. 将输入操作放到一个循环中,一次性读入所有需要的参数。这样可以减少输入操作的次数,提高程序效率。
3. 在循环中判断输入参数是否合法,如果不合法直接跳过,避免无效操作。
4. 在查找实验室时使用 `std::unordered_map::find` 方法代替 `std::unordered_map::at` 方法,因为前者不会抛出异常,而后者会在查找失败时抛出 `std::out_of_range` 异常。这样可以避免异常处理带来的性能损失。
5. 在处理操作时,只对合法的操作符进行操作,避免无效操作。
阅读全文