C++存储set元素到指针数组报错及直接删除元素方案咨询
问题解决&方案说明
报错原因分析
set作为有序关联容器,为了保证内部排序结构不被破坏,其迭代器解引用后得到的是const类型的元素引用,因此&(*id)得到的是const Movie*类型,和你声明的Movie* pointers[100][100]的数组元素类型不匹配,才会出现类型赋值错误。
原思路的可行性问题
就算你把数组类型改成const Movie*,也无法直接用指针调用set的erase方法:set的erase接口只接受迭代器、元素值、迭代器区间三类参数,不支持直接传入元素指针,无法达到你跳过遍历直接删除的需求。
存储迭代器方案说明
你修改为存储set<Movie>::iterator的方案是完全可行的,set的迭代器符合以下特性:
- 只有被删除元素对应的迭代器会失效,其他未被删除的元素的迭代器始终有效
- 可以直接传入erase方法完成O(1)复杂度的删除操作,不需要再次遍历set查找元素
注意事项
- 你需要先给
Movie结构体重载<比较运算符,否则set无法完成元素排序,编译会报错,示例重载代码:
struct Movie { int movieId; int shopId; int priceId; bool operator<(const Movie& other) const { if (movieId != other.movieId) return movieId < other.movieId; return shopId < other.shopId; } };
- 元素删除后,要同步把数组对应位置的迭代器标记为失效(比如赋值为
setMovie.end()),避免后续误用失效迭代器引发未定义行为 - 要确保
movieId和shopId的取值范围在[0,99]之间,否则会出现数组越界问题
补充代码修正说明
你提供的参考代码里有一处笔误:set不支持下标访问,setMovie[1].erase(pointers[1][0])的正确写法是setMovie.erase(pointers[1][0])。
内容的提问来源于stack exchange,提问作者user9137963
相关产品推荐
相关产品推荐

