``` #include <iostream> #include <vector> #include <algorithm> #include <iomanip> using namespace std; int main() { int n; double w, u, v, t1, t2; cin >> n >> w >> u >> v >> t1 >> t2; vector<pair<double, double>> forbidden; for (int k = 1; k <= n; ++k) { char dir; int m; cin >> dir >> m; double T_start = (k - 1) * w / v; double T_end = k * w / v; for (int i = 0; i < m; ++i) { double l, p; cin >> l >> p; if (dir == 'E') { p = -p; // 转换为西向 } // 计算时间窗口 double a = (p - l) / u; double b = p / u; // 计算禁止区间 double forbid_start = a - T_end; double forbid_end = b - T_start; forbidden.emplace_back(forbid_start, forbid_end); } } // 合并重叠的禁止区间 sort(forbidden.begin(), forbidden.end()); vector<pair<double, double>> merged; for (auto &interval : forbidden) { if (merged.empty()) { merged.push_back(interval); } else { auto &last = merged.back(); if (interval.first <= last.second) { last.second = max(last.second, interval.second); } else { merged.push_back(interval); } } } // 提取在[t1, t2]范围内的有效禁止区间 vector<pair<double, double>> valid_forbidden; for (auto &interval : merged) { double s = max(interval.first, t1); double e = min(interval.second, t2); if (s < e) { valid_forbidden.emplace_back(s, e); } } // 计算最大允许时间段 double max_len = 0.0; double current_start = t1; for (auto &interval : valid_forbidden) { double s = interval.first; double e = interval.second; if (current_start < s) { max_len = max(max_len, s - current_start); current_start = e; } else { current_start = max(current_start, e); } } if (current_start < t2) { max_len = max(max_len, t2 - current_start); } cout << fixed << setprecision(3) << max_len << endl; return 0; }```以c++98标准重构代码
时间: 2025-07-14 14:40:54 浏览: 7
<think>嗯,用户让我用C++98标准来重构他们提供的C++代码。首先,我需要仔细阅读原始代码,看看哪些部分不符合C++98标准。C++98和C++11之间的差异可能会影响代码的结构和功能,所以必须逐一检查。
首先,原代码中使用了`vector<pair<double, double>> forbidden;`,在C++98中,模板的右括号后面不能有空格,也就是必须写成`vector<pair<double, double> >`,中间有个空格。这一点需要修改所有类似的地方,包括`merged`和`valid_forbidden`的声明。
接下来,原代码使用了`emplace_back`方法,这在C++98中是不存在的。`emplace_back`是C++11引入的,所以需要替换为`push_back`,并且构造pair对象的时候要显式使用`make_pair`。例如,`forbidden.emplace_back(forbid_start, forbid_end);`应该改为`forbidden.push_back(make_pair(forbid_start, forbid_end));`。同样,其他使用`emplace_back`的地方也要做同样的处理。
然后,检查循环中的范围for循环。原代码中有`for (auto &interval : forbidden)`,这在C++98中是不支持的,必须改为普通的for循环,使用迭代器或者索引。例如,用`for (size_t i = 0; i < forbidden.size(); ++i)`,然后通过`forbidden[i]`来访问元素。同样适用于其他类似的循环,比如处理`merged`和`valid_forbidden`的部分。
另外,变量声明的位置在C++98中可能需要在循环外部先声明,再在循环内赋值。比如在合并区间的循环中,原代码使用了`auto &last = merged.back();`,这里`auto`关键字在C++98中不可用,必须显式声明类型为`pair<double, double>&`。同样,其他使用`auto`的地方都需要替换成具体类型。
还需要注意,C++98中的`>>`在嵌套模板时需要避免连写,比如`vector<pair<double, double>>`必须写成`vector<pair<double, double> >`,每个右括号后面加一个空格。
此外,检查输入输出部分。原代码使用了`cin`和`cout`,这在C++98中是没问题的,但需要确保头文件正确包含,比如`#include <iomanip>`用于格式化输出。
然后,检查是否有C++11特有的库函数或特性被使用,比如`emplace_back`和范围for循环,这些都需要替换成C++98兼容的方式。
现在,具体来看代码的每个部分:
1. 在forbidden向量的声明中,将`>>`改为`> >`。
2. 将所有的`emplace_back`替换为`push_back(make_pair(...))`。
3. 修改范围for循环,改为基于迭代器或索引的传统循环。
4. 替换所有`auto`关键字为具体的类型声明。
5. 确保所有变量在声明时初始化,或者在循环外声明,因为C++98可能不允许在循环初始化语句中声明变量(比如for循环中的int i=0在C++98是允许的,没问题)。
例如,处理合并区间的循环:
原代码:
```cpp
for (auto &interval : forbidden) {
if (merged.empty()) {
merged.push_back(interval);
} else {
auto &last = merged.back();
// ...
}
}
```
需要改为:
```cpp
for (vector<pair<double, double> >::const_iterator it = forbidden.begin(); it != forbidden.end(); ++it) {
const pair<double, double>& interval = *it;
if (merged.empty()) {
merged.push_back(interval);
} else {
pair<double, double>& last = merged.back();
// ...
}
}
```
或者使用索引循环:
```cpp
for (size_t i = 0; i < forbidden.size(); ++i) {
const pair<double, double>& interval = forbidden[i];
// 同上处理
}
```
同样,后续处理valid_forbidden和计算max_len的循环也需要类似修改。
在处理合并区间的时候,原代码中的`last`是一个引用,C++98支持引用,所以没问题,但需要显式声明类型。
另外,在计算`valid_forbidden`的时候,原代码中的循环同样需要修改。
最后,检查输出部分,`cout << fixed << setprecision(3) << max_len << endl;`在C++98中是有效的,因为`fixed`和`setprecision`在旧标准中已经存在。
总结需要修改的部分:
- 替换所有模板中的`>>`为`> >`。
- 替换`emplace_back`为`push_back(make_pair(...))`。
- 替换范围for循环为传统循环。
- 替换`auto`为具体类型。
- 确保变量声明符合C++98标准(比如在循环外部声明迭代器或索引)。
现在,逐步重构代码:
1. 修改所有vector的模板参数,添加空格。
2. 替换所有emplace_back为push_back和make_pair。
3. 修改所有范围for循环,使用迭代器或索引。
4. 替换auto为具体类型,如pair<double, double>&等。
5. 测试重构后的代码,确保逻辑与原代码一致。
例如,修改后的合并区间部分可能如下:
原代码:
```cpp
sort(forbidden.begin(), forbidden.end());
vector<pair<double, double>> merged;
for (auto &interval : forbidden) {
if (merged.empty()) {
merged.push_back(interval);
} else {
auto &last = merged.back();
if (interval.first <= last.second) {
last.second = max(last.second, interval.second);
} else {
merged.push_back(interval);
}
}
}
```
改为:
```cpp
sort(forbidden.begin(), forbidden.end());
vector<pair<double, double> > merged;
for (size_t i = 0; i < forbidden.size(); ++i) {
const pair<double, double>& interval = forbidden[i];
if (merged.empty()) {
merged.push_back(interval);
} else {
pair<double, double>& last = merged.back();
if (interval.first <= last.second) {
last.second = max(last.second, interval.second);
} else {
merged.push_back(interval);
}
}
}
```
同时,在C++98中,max函数可能需要包含头文件`<algorithm>`,并且对于两个double的比较,使用std::max。
同样处理其他循环,比如处理valid_forbidden的循环:
原代码:
```cpp
vector<pair<double, double>> valid_forbidden;
for (auto &interval : merged) {
double s = max(interval.first, t1);
double e = min(interval.second, t2);
if (s < e) {
valid_forbidden.emplace_back(s, e);
}
}
```
改为:
```cpp
vector<pair<double, double> > valid_forbidden;
for (vector<pair<double, double> >::const_iterator it = merged.begin(); it != merged.end(); ++it) {
const pair<double, double>& interval = *it;
double s = std::max(interval.first, t1);
double e = std::min(interval.second, t2);
if (s < e) {
valid_forbidden.push_back(make_pair(s, e));
}
}
```
或者使用索引:
```cpp
for (size_t i = 0; i < merged.size(); ++i) {
const pair<double, double>& interval = merged[i];
// 同上
}
```
在计算最大允许时间段的部分:
原代码:
```cpp
double current_start = t1;
for (auto &interval : valid_forbidden) {
double s = interval.first;
double e = interval.second;
if (current_start < s) {
max_len = max(max_len, s - current_start);
current_start = e;
} else {
current_start = max(current_start, e);
}
}
```
改为:
```cpp
double current_start = t1;
for (size_t i = 0; i < valid_forbidden.size(); ++i) {
const pair<double, double>& interval = valid_forbidden[i];
double s = interval.first;
double e = interval.second;
if (current_start < s) {
max_len = std::max(max_len, s - current_start);
current_start = e;
} else {
current_start = std::max(current_start, e);
}
}
```
最后,确保所有使用`auto`的地方都替换成了具体类型,例如在合并区间的循环中,`auto &last = merged.back();`改为`pair<double, double>& last = merged.back();`。
测试这些修改后,代码应该符合C++98标准,同时保持原有逻辑不变。需要特别注意所有可能引入错误的地方,比如循环变量的作用域和类型是否正确,以及是否遗漏了任何C++11特有的语法。</think>以下是根据C++98标准重构后的代码,关键修改点已用注释标出:
$$// 头文件保留不变
#include <iostream>
#include <vector>
#include <algorithm>
#include <iomanip>
using namespace std;
int main() {
int n;
double w, u, v, t1, t2;
cin >> n >> w >> u >> v >> t1 >> t2;
// C++98要求模板右括号必须加空格
vector<pair<double, double> > forbidden;
for (int k = 1; k <= n; ++k) {
char dir;
int m;
cin >> dir >> m;
double T_start = (k - 1) * w / v;
double T_end = k * w / v;
for (int i = 0; i < m; ++i) {
double l, p;
cin >> l >> p;
if (dir == 'E') {
p = -p;
}
double a = (p - l) / u;
double b = p / u;
double forbid_start = a - T_end;
double forbid_end = b - T_start;
// C++98使用push_back+make_pair代替emplace_back
forbidden.push_back(make_pair(forbid_start, forbid_end));
}
}
sort(forbidden.begin(), forbidden.end());
vector<pair<double, double> > merged;
for (vector<pair<double, double> >::const_iterator it = forbidden.begin();
it != forbidden.end(); ++it) // C++98使用迭代器遍历
{
const pair<double, double>& interval = *it;
if (merged.empty()) {
merged.push_back(interval);
} else {
pair<double, double>& last = merged.back();
if (interval.first <= last.second) {
last.second = max(last.second, interval.second);
} else {
merged.push_back(interval);
}
}
}
vector<pair<double, double> > valid_forbidden;
for (vector<pair<double, double> >::const_iterator it = merged.begin();
it != merged.end(); ++it)
{
const pair<double, double>& interval = *it;
double s = max(interval.first, t1);
double e = min(interval.second, t2);
if (s < e) {
valid_forbidden.push_back(make_pair(s, e));
}
}
double max_len = 0.0;
double current_start = t1;
for (vector<pair<double, double> >::const_iterator it = valid_forbidden.begin();
it != valid_forbidden.end(); ++it)
{
const pair<double, double>& interval = *it;
double s = interval.first;
double e = interval.second;
if (current_start < s) {
max_len = max(max_len, s - current_start);
current_start = e;
} else {
current_start = max(current_start, e);
}
}
if (current_start < t2) {
max_len = max(max_len, t2 - current_start);
}
cout << fixed << setprecision(3) << max_len << endl;
return 0;
}$$
关键修改说明(使用C++98特性):
1. 模板语法:将`vector<pair<double, double>>`改为`vector<pair<double, double> >`
2. 迭代器遍历:用传统迭代器`const_iterator`替换C++11的范围for循环
3. 对象创建:使用`push_back(make_pair(x,y))`代替`emplace_back(x,y)`
4. 类型声明:显式声明迭代器类型,去除`auto`关键字
5. 算法兼容性:确保所有标准库函数调用符合C++98规范
代码功能保持完全一致,仍用于计算船舶穿越航道时的最大安全时间窗口。算法时间复杂度仍为$O(m \log m)$,其中m是总障碍物数量。
阅读全文
相关推荐


















