<think>我们只需要将原来的std::unordered_map替换为std::map即可,因为两者的接口在查找操作上是兼容的(都有find成员函数,且返回迭代器)。但是需要注意,std::map是有序的(按照键的字典序),而std::unordered_map是无序的。不过在这个场景中,我们只进行查找操作,不涉及遍历,所以有序性不会影响功能。
具体步骤:
1. 将类型std::unordered_map改为std::map。
2. 由于键是字符串,且原来的顺序并不重要,所以使用std::map后,内部会按照字符串的字典序自动排序,但这不影响查找结果。
注意:原代码中在查找失败后抛出异常,这部分保持不变。
改写后的映射表:
另外,原代码中映射的值类型是枚举类型(假设为CaptureImageSize枚举),这里保持不变。
代码示例:</think>### 使用 `std::map` 实现分辨率映射表
以下是完整实现方案,将原 `std::unordered_map` 替换为 `std::map` 并保持功能不变:
```cpp
#include <map>
#include <string>
#include <stdexcept>
// 假设的枚举类型(根据实际定义调整)
enum CaptureImageSize {
CAPTURE_IMAGE_SIZE_D1,
CAPTURE_IMAGE_SIZE_HD1,
// ... 其他枚举值
};
CaptureImageSize getImageSize(const std::string& resolutionStr) {
// 创建有序映射表(按键名字典序排序)
static const std::map<std::string, CaptureImageSize> resolutionMap = {
{"1024x1536", CAPTURE_IMAGE_SIZE_3M_N},
{"1024x576", CAPTURE_IMAGE_SIZE_WSVGA},
{"1280x720", CAPTURE_IMAGE_SIZE_720P},
{"1280x960", CAPTURE_IMAGE_SIZE_1_3M},
{"1296x1520", CAPTURE_IMAGE_SIZE_4M_N},
{"1600x1200", CAPTURE_IMAGE_SIZE_UXGA},
{"160x128", CAPTURE_IMAGE_SIZE_QQVGA},
{"176x120", CAPTURE_IMAGE_SIZE_QCIF},
{"176x144", CAPTURE_IMAGE_SIZE_QCIF},
{"1872x1408", CAPTURE_IMAGE_SIZE_2_5M}, // 注意:键值相同会自动覆盖
{"1872x1408", CAPTURE_IMAGE_SIZE_5M_N},
{"1920x1080", CAPTURE_IMAGE_SIZE_1080P},
{"1920x1200", CAPTURE_IMAGE_SIZE_WUXGA},
{"1920x2160", CAPTURE_IMAGE_SIZE_4K_N},
{"2048x1536", CAPTURE_IMAGE_SIZE_3M},
{"2048x2160", CAPTURE_IMAGE_SIZE_4K_N},
{"240x192", CAPTURE_IMAGE_SIZE_ND1},
{"2592x1520", CAPTURE_IMAGE_SIZE_4M},
{"3072x2048", CAPTURE_IMAGE_SIZE_6M},
{"320x240", CAPTURE_IMAGE_SIZE_QVGA},
{"3264x2448", CAPTURE_IMAGE_SIZE_8M},
{"352x240", CAPTURE_IMAGE_SIZE_CIF},
{"352x288", CAPTURE_IMAGE_SIZE_CIF},
{"352x480", CAPTURE_IMAGE_SIZE_BCIF},
{"352x576", CAPTURE_IMAGE_SIZE_BCIF},
{"3744x1408", CAPTURE_IMAGE_SIZE_5M},
{"3840x2160", CAPTURE_IMAGE_SIZE_4K},
{"4000x3000", CAPTURE_IMAGE_SIZE_12M},
{"4096x2160", CAPTURE_IMAGE_SIZE_4K},
{"480x480", CAPTURE_IMAGE_SIZE_SVCD},
{"640x360", CAPTURE_IMAGE_SIZE_NHD},
{"640x480", CAPTURE_IMAGE_SIZE_VGA},
{"640x720", CAPTURE_IMAGE_SIZE_720N},
{"704x240", CAPTURE_IMAGE_SIZE_HD1},
{"704x288", CAPTURE_IMAGE_SIZE_HD1},
{"704x480", CAPTURE_IMAGE_SIZE_D1},
{"704x576", CAPTURE_IMAGE_SIZE_D1},
{"926x576", CAPTURE_IMAGE_SIZE_650TVL},
{"960x1080", CAPTURE_IMAGE_SIZE_1080N}
};
// 使用结构化绑定处理查找结果[^2]
if (auto it = resolutionMap.find(resolutionStr); it != resolutionMap.end()) {
return it->second;
}
throw std::invalid_argument("Unsupported resolution: " + resolutionStr);
}
```
### 关键改进说明
1. **数据结构变更**
```cpp
// 原代码
static const std::unordered_map<std::string, CaptureImageSize> resolutionMap = {...};
// 新代码
static const std::map<std::string, CaptureImageSize> resolutionMap = {...};
```
- 直接替换容器类型
- 保持键类型为 `std::string`,值类型为枚举
2. **有序性处理**
- 映射表按键名字典序自动排序(如 `"1024x1536"` → `"1024x576"` → ...)
- 重复键处理:后插入的值覆盖前值(如 `"1872x1408"` 只保留最后定义的 `CAPTURE_IMAGE_SIZE_5M_N`)
3. **现代C++特性**
```cpp
// 使用带初始化的if语句[^2]
if (auto it = resolutionMap.find(resolutionStr); it != resolutionMap.end()) {
return it->second;
}
```
- 将查找和条件检查合并,避免作用域污染
- 使用结构化绑定可读性更强(但此处直接使用迭代器更简洁)
4. **性能优化**
- 静态常量映射表:只需初始化一次
- 查找复杂度 $O(\log n)$,对于典型分辨率数量(约30项)效率足够
### 注意事项
1. **键冲突处理**
```cpp
{"1872x1408", CAPTURE_IMAGE_SIZE_2_5M},
{"1872x1408", CAPTURE_IMAGE_SIZE_5M_N} // 此条目会覆盖前一个
```
- 需检查是否有重复键(如原表有多个 `"1872x1408"`)
- 解决方案:合并相同键或使用多值映射
2. **异常安全**
```cpp
throw std::invalid_argument("Unsupported resolution: " + resolutionStr);
```
- 保持与原设计一致的异常类型
- 提供详细错误信息帮助调试
3. **遍历顺序影响**
- 若需要按原始顺序遍历,需额外维护顺序索引
- 或改用 `std::vector<std::pair>` 保留插入顺序
> 此实现完全兼容原接口,调用方无需修改代码即可无缝切换[^1][^3]。对于纯查找场景,`std::map` 的有序性不会影响功能正确性。