如何对比std::vector元素与std::map的键元素并完成值替换
问题根本原因
- 类型不匹配:你代码中
std::vector存储的元素是std::string类型,std::map的键是int类型,C++没有默认支持这两种不同类型的相等比较逻辑,所以str_v[i] == itr->first这行代码无法编译通过。 - 原有代码还存在多处逻辑错误:
- 迭代器
itr仅在初始化时赋值为numbers.begin(),第一次内层循环执行完后itr就等于numbers.end(),后续遍历vector其他元素时,内层循环根本不会执行 - 匹配成功后的赋值逻辑错误:
numbers[i]中的i是vector的下标,不是你要匹配的map键,无法拿到对应的值 - 手动遍历整个map做匹配的效率极低,
std::map本身提供了O(logn)复杂度的find查找接口,完全不需要暴力遍历
- 迭代器
实现方案
你只需要将vector中存储的数字字符串转为int类型,再和map的键做匹配即可,修正后的可运行代码如下:
#include <iostream> #include <string> #include <map> #include <vector> #include <stdexcept> // 用于处理stoi转换异常 int main() { std::map<int, std::string> numbers; numbers.insert(std::pair<int, std::string>(0, "zero")); numbers.insert(std::pair<int, std::string>(1, "one")); numbers.insert(std::pair<int, std::string>(2, "two")); numbers.insert(std::pair<int, std::string>(3, "three")); numbers.insert(std::pair<int, std::string>(4, "four")); numbers.insert(std::pair<int, std::string>(5, "five")); numbers.insert(std::pair<int, std::string>(6, "six")); numbers.insert(std::pair<int, std::string>(7, "seven")); numbers.insert(std::pair<int, std::string>(8, "eight")); numbers.insert(std::pair<int, std::string>(9, "nine")); numbers.insert(std::pair<int, std::string>(10, "ten")); std::vector<std::string> str_v ={"What", "The", "2", "4", "12"}; // 遍历vector每个元素 for (auto& elem : str_v) { try { // 把字符串转为int,解决类型不匹配问题 int key = std::stoi(elem); // 直接在map中查找对应键,不需要遍历 auto find_it = numbers.find(key); if (find_it != numbers.end()) { // 找到匹配项,替换为map对应的值 elem = find_it->second; } } catch (const std::invalid_argument&) { // 字符串不是合法数字,不做处理 } catch (const std::out_of_range&) { // 数字超出int范围,不做处理 } std::cout << "Element of vector: " << elem << std::endl; } return 0; }
运行输出结果如下:
Element of vector: What Element of vector: The Element of vector: two Element of vector: four Element of vector: 12
如果你确实不想做字符串转int的操作,也可以把map的int键转为字符串再比较,但是这种方式需要遍历整个map,执行效率远低于上面的方案,不推荐使用。
内容的提问来源于stack exchange,提问作者Bis Andi Grenzen
相关产品推荐
相关产品推荐

