为何map迭代器会报base operand invalid错误?代码求助
问题分析与修复方案
我来帮你拆解下这段代码的问题所在~
首先,你遇到的第6行错误,核心原因是范围for循环中元素的访问方式错误:
在for(auto& elem : a)这个循环里,elem是map<long int, long int>中元素的引用,类型是std::pair<const long int, long int>&——它是一个对象,不是指针,所以访问成员变量应该用.运算符,而不是->。你写的elem->first属于指针访问语法,自然会触发编译错误。
另外还要提醒你一个潜在风险:你手动让pos迭代器自增,如果传入的两个mapa和p的大小不一致,pos++很可能会导致迭代器越界,触发未定义行为,这部分要注意保证两个容器的元素数量相同。
修正后的代码
long int lilysHomework(map<long int,long int>& a,int n,map<long int,long int>& p) { long int c=0; map<long int,long int>::iterator pos; pos=p.begin(); for(auto& elem : a) { // 把elem->first改成elem.first,因为elem是对象引用不是指针 if((pos->second)!=(elem.first)) c++; pos++; } c--; cout << c; return c; }
额外优化建议
如果你的场景允许,其实可以用双迭代器遍历代替范围for,这样能更直观地同步两个map的遍历,避免手动管理迭代器的失误,还能规避容器大小不一致导致的越界问题,比如:
long int lilysHomework(map<long int,long int>& a,int n,map<long int,long int>& p) { long int c=0; auto it_a = a.begin(); auto it_p = p.begin(); // 同时判断两个迭代器是否到末尾,避免越界 while(it_a != a.end() && it_p != p.end()) { if(it_p->second != it_a->first) { c++; } ++it_a; ++it_p; } c--; cout << c; return c; }
内容的提问来源于stack exchange,提问作者nishant_boro
相关产品推荐
相关产品推荐

