You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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查找元素

注意事项

  1. 你需要先给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;
    }
};
  1. 元素删除后,要同步把数组对应位置的迭代器标记为失效(比如赋值为setMovie.end()),避免后续误用失效迭代器引发未定义行为
  2. 要确保movieId和shopId的取值范围在[0,99]之间,否则会出现数组越界问题

补充代码修正说明

你提供的参考代码里有一处笔误:set不支持下标访问,setMovie[1].erase(pointers[1][0])的正确写法是setMovie.erase(pointers[1][0])。

内容的提问来源于stack exchange,提问作者user9137963

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 12:21:02